2016-11-14 57 views
0

我在使用自定义对象作为我在MongoDb中的_id值时遇到了一些问题。在MongoDb中使用对象作为_id导致查询上的collscan

我存储在_id的物体看起来是这样的:

"_id" : { 
    "EDIEL" : "1010101010101", 
    "StartDateTicks" : NumberLong(636081120000000000) 
} 

现在,当我执行以下查询:

.find({ 
     "_id.EDIEL": { $eq: "1010101010101" }, 
     "_id.StartDateTicks": { $gte: 636082776000000000, $lt: 636108696000000000 } 
}).explain() 

我做了COLLSCAN。我无法弄清楚为什么。是否因为我没有对_id对象对象查询?

有没有人知道我在做什么错在这里? :-)

编辑:

试图创建包含EDIELStartDateTicks字段的化合物指数,再次运行查询,现在,它使用索引,而不是一个列扫描。虽然这有效,但避免使用额外的索引并仅仅使用_id(因为它基本上是一个“免费”索引)仍然很好。所以,问题仍然存在:为什么我不能查询_id.EDIEL_id.StartDateTicks并使使用索引?

+0

你的问题是什么导致COLLSCAN?你怀疑是在自定义_ID?如果是的话,那么你猜测它是错误的,因为你调用了.explain()方法,该方法又执行COLLSCAN。请参阅https://docs.mongodb.com/v3.2/reference/explain-results/ –

+0

您需要分别对两个字段进行索引,因为索引不能在嵌入式文档中。 – hyades

+0

谢谢@hyades,这正是我需要的答案:-)如果你作出回答,我会接受它。 –

回答

0

索引用于键而不是对象,所以当您使用_id对象时,对象上的索引不能用于您在对象字段上执行的特定查询。

这不仅适用于_id,也适用于子文档。

{ 
"name":"awesome book", 
"detail" :{ 
    "pages":375, 
    "alias" : "AB" 
} 
} 

现在,当你有详细的索引,而由detail.pages或detail.alias查询,在细节上的索引不能使用,当然也不范围查询。你需要在detail.pages和detail.alias上有索引。

索引应用于对象时,它维护对象整体而非每个字段的索引,这就是为什么对象字段上的查询无法使用对象索引的原因。

希望帮助

0

您将需要指数这两个领域分开,因为索引不能是嵌入式的文件。因此,创建复合索引是唯一可用的选项,或者在字段上创建多个索引,然后使用交集索引是您的选项。