sql >> Database >  >> NoSQL >> MongoDB

MongoDB-bereikquery op volledige ingesloten documentwaarde

Noteer de opdracht een paar regels verderop in de documentatie die je hebt gelinkt:

Dit geeft aan dat niet-bestaande velden en velden die op null zijn ingesteld speciaal worden behandeld.

Om de documenten {} en {a: null} om equivalent te zijn in sorteervolgorde, moet het sorteeralgoritme rekening houden met het ontbrekende sorteerveld om aanwezig te zijn, en een waarde hebben van null .

Als je het ontbrekende veld expliciet toevoegt, gewoon om te zien hoe het eruit ziet, is de volgorde logischer.

Het filter {tag: { $gte: { baz: MinKey() }}} toegepast op {_id: 1, tag: {bar: "BAR"}} vergelijkt in wezen {baz: MinKey()} met {baz: null, bar: "BAR"} .

Bovenaan de documentatie die je hebt gelinkt, staat dat MinKey is kleiner dan null , dus dat is de juiste volgorde.

BEWERKEN

Over het algemeen is query's het meest efficiënt wanneer de veldnamen zelf geen gegevens zijn. In termen van een database in tabelvorm, welke kolom zou "baz" bevatten?

Een kleine wijziging in het schema zou dit type query vereenvoudigen. In plaats van {tagname: tagvalue} , gebruik {k:tagname, v:tagvalue} . U kunt dan tag.k index indexeren en/of tag.v , en zoek op tag.k om alle documenten met een "baz"-tag te vinden, zou het opvragen van tags met ongelijkheidsbewerkingen intuïtiever werken.

db.collection.find({"tag.k":{$gte:"baz"}})

Exacte overeenkomsten kunnen worden gedaan met elemMatch zoals

db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})

Als u echt wilt dat de geretourneerde documenten {tagname: tagvalue} . bevatten , de $arrayToObject aggregatie-operator kan dat doen:

db.collection.aggregate([
  {$match: {
      "tag.k": {$gte: "baz"}
  }},
  {
    $addFields: {
      tag: {$arrayToObject: [["$tag"]]}
  }}
])

Speeltuin




  1. Express met Mongodb-documenten in Jade

  2. Is er een gelijkwaardige tool zoals sql profiler voor mongodb?

  3. Gebruiken als een grafische database voor het vinden van vrienden van vrienden in MongoDb

  4. Redis pub/sub op rails