Обърнете внимание на командата няколко реда по-надолу в документацията, която сте свързали:
Това ви казва, че несъществуващите полета и полетата с нула се третират специално.
За документите {}
и {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"]]}
}}
])