Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中化合物的预期行为?_Mongodb_Indexing - Fatal编程技术网

MongoDB中化合物的预期行为?

MongoDB中化合物的预期行为?,mongodb,indexing,Mongodb,Indexing,我有一个复合_id,包含3个数字属性: _id”:{ “KeyA”:0, “KeyB”:0, “KeyC”:0 } 该数据库有200万个相同的KeyA值和500k个相同的KeyB值集群 我的理解是,我可以使用以下命令高效地查询KeyA和KeyB: find( { "_id.KeyA" : 1, "_id.KeyB": 3 } ).limit(100) 当我解释这个查询时,结果是: "cursor" : "BasicCursor", "nscanned" : 1000100, "nscanned

我有一个复合_id,包含3个数字属性:

_id”:{ “KeyA”:0, “KeyB”:0, “KeyC”:0 }

该数据库有200万个相同的KeyA值和500k个相同的KeyB值集群

我的理解是,我可以使用以下命令高效地查询KeyA和KeyB:

find( { "_id.KeyA" : 1, "_id.KeyB": 3 } ).limit(100)
当我解释这个查询时,结果是:

"cursor" : "BasicCursor",
"nscanned" : 1000100,
"nscannedObjects" : 1000100,
"n" : 100,
"millis" : 1592,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
"cursor" : "BasicCursor",
"nscanned" : 2000000,
"nscannedObjects" : 2000000,
"n" : 500000,
"millis" : 3181,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
如果没有限制(),结果是:

"cursor" : "BasicCursor",
"nscanned" : 1000100,
"nscannedObjects" : 1000100,
"n" : 100,
"millis" : 1592,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
"cursor" : "BasicCursor",
"nscanned" : 2000000,
"nscannedObjects" : 2000000,
"n" : 500000,
"millis" : 3181,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
据我所知,BasicCursor意味着索引被忽略,而且两个查询的执行时间都很长——即使我只请求了100条记录,也需要大约1.5秒。我打算使用该限制来实现分页,但这显然太慢了

命令:

find( { "_id.KeyA" : 1, "_id.KeyB": 3, , "_id.KeyC": 1000 } )
正确使用BtreeCursor并快速执行,表明复合id正确

我正在使用MongoDb的1.8.3版。有人能澄清一下我是否看到了预期的行为,或者我是否误解了如何使用/查询复合索引吗

谢谢,
Paul.

您需要一个单独的复合索引来描述您想要的行为。一般来说,我建议不要使用对象作为_id,因为键顺序在比较中很重要,所以{a:1,b:1}不等于{b:1,a:1}.由于并非所有驾驶员都能在物体中保持关键顺序,因此通过以下操作很容易击中自己的脚:

db.foo.save(db.foo.findOne())
索引不是复合索引,而是对
\u id
字段的整个值的索引。MongoDB不查看索引字段,而是使用字段的原始BSON表示进行比较(如果我正确阅读文档)


要实现您想要的功能,您需要在
{id.KeyA:1,{id.KeyB:1,{id.KeyC:1}
上创建一个实际的复合索引(这也应该是一个唯一的索引)。因为您不能在
\u id
上没有索引,所以最好将其保留为
ObjectId
(这将创建一个更小的索引,并浪费更少的空间)并将
KeyA
KeyB
KeyC
字段作为文档的属性。例如
{u id:ObjectId(“xyz…”)、KeyA:1、KeyB:2、KeyB:3}

Theo-谢谢,虽然你的答案与mstreams基本相同,但我接受了你的答案,因为你明确指出_id字段没有给我一个复合索引(这是我没有掌握的部分)。我天真地认为,如果我在_id字段上创建了一个自动索引的复合键,那么最终结果将是一个复合索引。你可以生活和学习。