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