MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Interrogazione dell'intervallo MongoDB sull'intero valore del documento incorporato

Annota il comando poche righe più in basso nella documentazione che hai collegato:

Questo ti dice che i campi inesistenti e quelli impostati su null vengono trattati in modo speciale.

In ordine per i documenti {} e {a: null} per essere equivalente in ordinamento, l'algoritmo di ordinamento deve considerare la presenza del campo di ordinamento mancante e avere un valore null .

Se aggiungi esplicitamente il campo mancante, solo per vedere come appare, l'ordinamento ha più senso.

Il filtro {tag: { $gte: { baz: MinKey() }}} applicato a {_id: 1, tag: {bar: "BAR"}} sta essenzialmente confrontando {baz: MinKey()} con {baz: null, bar: "BAR"} .

Nella parte superiore della documentazione che hai collegato, è riportato che MinKey è minore di null , quindi questo è l'ordine corretto.

MODIFICA

In generale, l'esecuzione di query è più efficiente quando i nomi dei campi non sono essi stessi dati. In termini di database tabulare, quale colonna conterrebbe "baz"?

Una leggera modifica allo schema semplificherebbe questo tipo di query. Invece di {tagname: tagvalue} , usa {k:tagname, v:tagvalue} . Puoi quindi indicizzare tag.k e/o tag.v e interroga su tag.k per trovare tutti i documenti con un tag "baz", eseguire query sui tag con operazioni di disuguaglianza funzionerebbe in modo più intuitivo.

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

Le corrispondenze esatte possono essere eseguite con elemMatch come

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

Se hai davvero bisogno che i documenti restituiti contengano {tagname: tagvalue} , il $arrayToObject l'operatore di aggregazione può farlo:

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

Parco giochi