Zwróć uwagę na polecenie kilka linijek dalej w dokumentacji, do której linkujesz:
Oznacza to, że nieistniejące pola i pola ustawione na null są traktowane specjalnie.
Aby uzyskać dokumenty {} i {a: null} aby być równoważne w kolejności sortowania, algorytm sortowania musi uwzględniać brakujące pole sortowania jako obecne i mieć wartość null .
Jeśli wyraźnie dodasz brakujące pole, aby zobaczyć, jak wygląda, kolejność ma większy sens.
Filtr {tag: { $gte: { baz: MinKey() }}} zastosowane do {_id: 1, tag: {bar: "BAR"}} zasadniczo porównuje {baz: MinKey()} z {baz: null, bar: "BAR"} .
W górnej części połączonej dokumentacji stwierdza, że MinKey jest mniejsze niż null , więc taka jest właściwa kolejność.
EDYTUJ
Ogólnie rzecz biorąc, wykonywanie zapytań jest najbardziej wydajne, gdy nazwy pól same w sobie nie są danymi. Jeśli chodzi o tabelaryczną bazę danych, która kolumna zawierałaby „baz”?
Niewielka zmiana w schemacie uprościłaby ten typ zapytania. Zamiast {tagname: tagvalue} , użyj {k:tagname, v:tagvalue} . Następnie możesz zindeksować tag.k i/lub tag.v i zapytaj o tag.k aby znaleźć wszystkie dokumenty ze znacznikiem „baz”, zapytania o znaczniki z operacjami nierówności działałyby bardziej intuicyjnie.
db.collection.find({"tag.k":{$gte:"baz"}})
Dokładne dopasowania można wykonać za pomocą elemMatch, takiego jak
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Jeśli naprawdę potrzebujesz, aby zwracane dokumenty zawierały {tagname: tagvalue} , $arrayToObject operator agregacji może to zrobić:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])