MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Bereichsabfrage für den gesamten eingebetteten Dokumentwert

Beachten Sie den Befehl ein paar Zeilen weiter unten in der von Ihnen verlinkten Dokumentation:

Dies sagt Ihnen, dass nicht vorhandene Felder und Felder, die auf null gesetzt sind, besonders behandelt werden.

Um die Dokumente {} und {a: null} um in der Sortierreihenfolge äquivalent zu sein, muss der Sortieralgorithmus berücksichtigen, dass das fehlende Sortierfeld vorhanden ist, und einen Wert von null haben .

Wenn Sie das fehlende Feld explizit hinzufügen, nur um zu sehen, wie es aussieht, ist die Reihenfolge sinnvoller.

Der Filter {tag: { $gte: { baz: MinKey() }}} angewendet auf {_id: 1, tag: {bar: "BAR"}} vergleicht im Wesentlichen {baz: MinKey()} mit {baz: null, bar: "BAR"} .

Ganz oben in der verlinkten Dokumentation steht, dass MinKey ist kleiner als null , das ist also die richtige Reihenfolge.

BEARBEITEN

Im Allgemeinen ist das Abfragen am effizientesten, wenn die Feldnamen selbst keine Daten sind. In Bezug auf eine tabellarische Datenbank, welche Spalte würde „baz“ enthalten?

Eine geringfügige Änderung des Schemas würde diese Art von Abfrage vereinfachen. Statt {tagname: tagvalue} , verwenden Sie {k:tagname, v:tagvalue} . Sie könnten dann tag.k indizieren und/oder tag.v , und fragen Sie nach tag.k Um alle Dokumente mit einem "baz"-Tag zu finden, würde die Abfrage von Tags mit Ungleichheitsoperationen intuitiver funktionieren.

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

Exakte Übereinstimmungen können mit elemMatch wie

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

Wenn Sie wirklich brauchen, dass die zurückgegebenen Dokumente {tagname: tagvalue} enthalten , das $arrayToObject Aggregationsoperator kann das:

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

Spielplatz