Mongo计数聚合返回0

时间:2014-01-18 19:23:58

标签: node.js mongodb mongoose

我有一个集合,其中包含数组属性的复合索引。我正在运行的查询是:

db.servers.find({$query: { features: {$elemMatch: {'name':'a','status':'passed'}}}}).count()

此查询用于返回有效数字,但现在只返回0.如果我删除了count()命令,我会得到一长串匹配。

问题类似于此处的问题 - MongoDB's count() incorrectly returns 0 if a query is given

到目前为止,我已经尝试重新启动,更新,运行repaireDatabase,运行reIndex,运行dropIndexes并让mongoose为我创建索引,并运行mongodump和mongorestore。因为我正在使用日记,所以我无法使用--repair标志运行mongod。

日志文件中有数百行同样的警告 -

  

警告:ClientCursor :: yield无法解锁b / c的递归锁ns:   zrk.servers top:{opid:26,active:true,secs_running:9,op:   “query”,ns:“zrk”,查询:{repairDatabase:1.0},客户端:   “127.0.0.1:49917”,desc:“conn1”,threadId:“0x7f5dfb4c2700”,   connectionId:1,locks:{^:“W”},waitingForLock:false,numYields:   0,lockStats:{timeLockedMicros:{},timeAcquiringMicros:{R:0,W:   3,r:0,w:2}}}

我最初启动此mongod配置为副本集,但我还没有添加任何辅助成员。数据目录和服务器位于不同的EBS卷上。

编辑:认为问题是一个损坏的数据库,我手动将所有文档移动到一个新的mongo。这解决了上述链接中的相同问题,但没有为我解决。

我还尝试删除旧的,现在为空的mongo上的索引,并添加一个或两个文档以再次运行查询。这也没有用。非id索引是

{
                "v" : 1,
                "key" : {
                        "features.name" : 1,
                        "features.status" : 1,
                        "random" : 1
                },
                "ns" : "zrk.servers",
                "name" : "features.name_1_features.status_1_random_1",
                "background" : true,
                "safe" : null
        }

如您所见,我通常使用此索引来选择随机文档。但它也用于上述查询。

1 个答案:

答案 0 :(得分:4)

我认为问题可能是您在查找查询中使用“$ query”。不再需要使用“$ query”作为find命令的一部分,并且根据文档prevents cursor helpers from working。尝试将查询重写为

db.servers.find({features:{$elemMatch:{'name':'a','status':'passed'}}})

然后查看.count()是否有效。