0

サブドキュメントとして呼び出されるコレクションがありvariantsます。specificationsドット表記を使用したバリアントの検索は機能しますが (インデックスは使用しません)、サブドキュメント形式を使用すると結果はゼロになります (ただしインデックスは使用されます)。私は何を間違えましたか?

> db.variants.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "automobile.variants",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
            "specifications" : 1
        },
        "ns" : "automobile.variants",
        "name" : "specifications_1"
    }
]
> db.variants.find({"specifications" : { "Body" : "SUV" }}).explain()
{
    "cursor" : "BtreeCursor specifications_1",
    "nscanned" : 0,
    "nscannedObjects" : 0,
    "n" : 0,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "specifications" : [
            [
                {
                    "Body" : "SUV"
                },
                {
                    "Body" : "SUV"
                }
            ]
        ]
    }
}
> db.variants.find({"specifications.Body" : "SUV" }).explain()
{
    "cursor" : "BasicCursor",
    "nscanned" : 787,
    "nscannedObjects" : 787,
    "n" : 176,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
}
4

2 に答える 2

2

サブドキュメント自体にインデックスを配置しました。

これを行うと、MongoDB は配列の要素にインデックスを付けます。

{
    Specifications: [
        {Body: 'SUV'}
    ]
}

次のクエリを実行すると、MongoDB はインデックスを使用できます。

db.col.find({Specifications: {Body: 'SUV'}})

それは要素に一致しますが、そのサブドキュメントの部分ではクエリできません。

インデックスを使用してサブドキュメントの部分ごとにクエリを実行する場合は、それらの部分にインデックスを付ける必要があります。つまり、次のようになります。

ensureIndex({Specifications.body: 1})
于 2013-01-22T08:16:17.077 に答える
1

この場合、クエリを作成する正確なフィールドにインデックスが必要ですspecifications.Body。最初のクエリでは、仕様フィールドにインデックスがあるため、クエリはインデックスを使用しますが、スキーマによれば有効ではありません。

于 2013-01-22T08:15:48.357 に答える