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"]]}
}}
])