Обърнете внимание на командата няколко реда по-надолу в документацията, която сте свързали:
Това ви казва, че несъществуващите полета и полетата с нула се третират специално.
За документите {} и {a: null} за да бъде еквивалентен в реда на сортиране, алгоритъмът за сортиране трябва да счита, че липсващото поле за сортиране присъства и да има стойност null .
Ако изрично добавите липсващото поле, само за да видите как изглежда, подреждането има повече смисъл.
Филтърът {tag: { $gte: { baz: MinKey() }}} приложено към {_id: 1, tag: {bar: "BAR"}} по същество сравнява {baz: MinKey()} с {baz: null, bar: "BAR"} .
В горната част на документацията, която сте свързали, се посочва, че MinKey е по-малко от null , така че това е правилното подреждане.
РЕДАКТИРАНЕ
По принцип заявките са най-ефективни, когато самите имена на полета не са данни. От гледна точка на таблична база данни, коя колона ще съдържа "baz"?
Лека промяна в схемата би опростила този тип заявка. Вместо {tagname: tagvalue} , използвайте {k:tagname, v:tagvalue} . След това можете да индексирате tag.k и/или tag.v и заявка към tag.k за да намерите всички документи с таг "baz", маркерите за заявки с операции за неравенство ще работят по-интуитивно.
db.collection.find({"tag.k":{$gte:"baz"}})
Точните съвпадения могат да бъдат направени с elemMatch като
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Ако наистина имате нужда върнатите документи да съдържат {tagname: tagvalue} , $arrayToObject операторът за агрегиране може да направи това:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])