根据您的查询,我想,你的文件看起来像这样:
{
"_id" : 1,
"lc" : "eng",
"group" : "xyz",
"indices" : [
{
"text" : "as",
"pos" : 2
},
{
"text" : "text",
"pos" : 4
}
]
}
我创建了一个测试收集这种格式的文件,创建索引,并跑了您发布与查询.explain()选项。
正在使用的索引按预期:
> db.test.ensureIndex({"lc":1, "group":1, "indices.text":1, "indices.pos":1})
> db.test.find({ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } }).explain()
{
"cursor" : "BtreeCursor lc_1_group_1_indices.text_1_indices.pos_1",
"isMultiKey" : true,
"n" : NumberLong(1),
"nscannedObjects" : NumberLong(1),
"nscanned" : NumberLong(1),
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : NumberLong(0),
"millis" : 0,
"indexBounds" : {
"lc" : [
[
"eng",
"eng"
]
],
"group" : [
[
"xyz",
"xyz"
]
],
"indices.text" : [
[
"as",
"as"
]
],
"indices.pos" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
"server" : "Marcs-MacBook-Pro.local:27017"
}
在.explain()功能的文档可在这里找到:http://www.mongodb.org/display/DOCS/Explain
.explain()可用于显示有关信息查询,包括使用哪个(如果有)索引。
谢谢马克 - 是的,我的文件看起来像那样。我从解释中注意到,'indexOnly'是错误的。这并不表示即使字段全部位于索引中,BSON也必须解压缩和扫描吗? – 2012-04-18 17:51:03
乐意帮忙! IndexOnly不适用于多键索引。这是因为每个嵌入式文档在索引中都有自己的条目。整个“索引”数组不存储在单个索引条目中。因此,即使使用索引,也必须读取实际的文档。这可以在“Multikeys”文档中的“索引中的精确数组匹配”一节中进行解释:http://www.mongodb.org/display/DOCS/Multikeys – Marc 2012-04-18 18:24:48
我可以理解,如果我查询'db.test.find ({lc:“eng”,group:“xyz”,“indices.text:”as“,”indices.pos“:{$ gt:1}}})'不需要$ elemMatch它需要扫描对象,但由于elemMatch需要已经在索引条目中的相同子对象,不是吗? – 2012-04-19 09:04:27