リンクしたドキュメントの数行下にあるコマンドに注意してください:
これは、存在しないフィールドとnullに設定されたフィールドが特別に扱われることを示しています。
ドキュメントの場合{}
および{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"]]}
}}
])