0

MongoDB には、次のドキュメントがあります。

{
  "_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
  "concepts": {
    "blabla": 20,
    "blibli": 100,
    "blublu": 250,
    ... (many more here)
  }
}

そして、「コンセプト」配列の「キー」を照会できるようにインデックスを付けたいと思います(実際にはmongoDB配列ではないことはわかっています...):

db.things.find({concepts:blabla});

上記のスキーマで可能ですか?または、ドキュメントを次のようなものにリファクタリングしますか

{
  "_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
  "concepts": ["blabla","blibli","blublu", ... (many more here)]
  }
}
4

3 に答える 3

1

実際の質問にお答えします。いいえ、現在のスキーマを指定すると、フィールド名にインデックスを付けることはできません。$exists はインデックスを使用しますが、これは存在チェックのみです。

あなたが使用しているようなスキーマには多くの問題があります。次のようにリファクタリングすることをお勧めします。

{
  "_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
  "concepts": [
    {name:"blabla", value: 20},
    {name:"blibli", value: 100},
    {name:"blublu", value: 250},
    ... (many more here)
  ]
}

次にインデックス{'concepts.name:1'}を作成すると、存在を確認するだけでなく、実際に概念名を照会できます。

TL;DR : いいえ、できません。

于 2012-08-16T13:20:25.440 に答える
1

特定のクエリでフィールドの存在をクエリできます。

db.your_collection.find({"concept.yourfield": { $exists: true }})

( $existsに注意してください)

サブドキュメントyourfieldのフィールドであるすべてのドキュメントを返しますconcept

編集:このソリューションはクエリに関するものです。インデックスには、フィールドではなく値が含まれています。

于 2012-08-16T10:17:45.837 に答える
0

MongoDB は配列の各値にインデックスを付けて、個々のアイテムを照会できるようにします

ただし、ネストされた配列では、サブフィールドにインデックスを付けるために mongodb にインデックスを付けるように指示する必要があります。

  db.col1.ensureIndex({'concepts.blabla':1})
  db.col1.ensureIndex({'concepts.blublu':1})
    db.col1.find({'concepts.blabla': 20}).explain()
    {
        "cursor" : "BtreeCursor concepts.blabla_1",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {
            "concepts.blabla" : [
                [
                    20,
                    20
                ]
            ]
        }
    }

index の作成後、カーソル タイプは BasicCursor から BtreeCursor に変わります。

質問の最後に述べたようにドキュメントを作成した場合

{
  "_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
  "concepts": ["blabla","blibli","blublu", ... (many more here)]
  }
}

以下のように、索引付けだけで十分です。

db.col1.ensureIndex({'concepts':1})
于 2012-08-16T10:07:05.350 に答える