我有一个名为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" : {
}
}
答案 0 :(得分:2)
您已将索引放在子文档本身上。
当你这样做时,MongoDB索引数组的元素,如果你有:
{
Specifications: [
{Body: 'SUV'}
]
}
如果您查询,MongoDB可以使用索引:
db.col.find({Specifications: {Body: 'SUV'}})
因为它与元素匹配,但它无法通过该子文档的各个部分进行查询。
如果您希望使用索引查询子文档的各个部分,您应该索引这些部分,即:
ensureIndex({Specifications.body: 1})
答案 1 :(得分:1)
您应该在查询的确切字段上有一个索引,在本例中为specifications.Body
。在您的第一个查询中,因为您在规范字段上有索引,所以查询使用索引,但根据您的架构它无效。