sql >> データベース >  >> NoSQL >> MongoDB

埋め込みドキュメント値全体に対するMongoDB範囲クエリ

    リンクしたドキュメントの数行下にあるコマンドに注意してください:

    これは、存在しないフィールドと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"]]}
      }}
    ])
    

    遊び場




    1. AzureVMはAzureRedisCacheに接続していませんが、ローカルはAzureRedisCacheに接続しています

    2. マングースを仮想的に取り込む

    3. MongoDBは、単一インデックスと複合インデックスに関してfind()。sort()クエリをどのように処理しますか?

    4. 複合インデックス付きのMongo$in