如何在MongoDB中进行有效查询以替换$

时间:2012-12-14 12:11:58

标签: mongodb

我有一个包含各种数据的MongoDB集合。 (大约数百万)

这些数据有一个像{k: {a:1,b:2,c:{},...}}这样的数据结构,我不知道它是什么。

现在我想对这个集合进行计数,以便使用k{k:{$exists:true}}不为空的集合中的总元素返回给我,但结果却很慢......

然后我在k上添加一个索引并尝试按{k:{$gt:{}}进行查询,但这不会返回正确的结果。

那么,现在如何计算这个集合呢?

请注意,我不知道k的数据结构。

3 个答案:

答案 0 :(得分:1)

如果您使用的是版本2之前的版本,$exists将无法使用索引。 请参阅此答案:https://stackoverflow.com/a/7503114/131809

因此,请尝试升级您的MongoDB版本

来自docs

  

在v2.0之前,$ exists无法使用索引。其他索引   字段仍然使用。
  即使有了,$ exists也不是很有效   索引,尤其是使用{$ exists:true},因为它必须有效   扫描所有索引值。

第二部分可能是重要的一点。

听起来sparse索引可能是这里的关键......

答案 1 :(得分:0)

尝试使用$ne : null

所以,根据您的代码示例:

{k:{$ne : null}}

答案 2 :(得分:0)

db.collection.count({k:{$ne:null}})

顺便使用k上的稀疏索引。

db.collection.ensureIndex({k:1}, {sparse: true});