2014-01-18 257 views
2

我有一个具有数组属性的复合索引的集合。我跑的查询是:Mongo count聚合返回0

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

该查询用于返回一个有效的数字,但现在它只返回0。如果我删除计数()命令,我得到比赛的一个长长的清单。

的问题是一个类似于这里 - MongoDB's count() incorrectly returns 0 if a query is given

到目前为止,我已经试过重新启动,更新,运行repaireDatabase,运行重新索引,运行dropIndexes并让猫鼬创建索引对我来说,和运行mongodump和mongorestore 。我一直无法运行带有--repair标志的mongod,因为我正在使用日志。

有数以百计此相同的警告的线的日志中文件 -

警告:ClientCursor ::产量不能解锁B/C递归锁纳秒: zrk.servers顶部:{OPID :26,active:true,secs_running:9,op: “query”,ns:“zrk”,query:{repairDatabase:1.0},client: “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上的索引,并添加一个或两个文档以再次运行查询。那也没用。非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 
     } 

正如你所看到的,我通常使用这个索引来选择随机文件。但它也用于上述查找查询。

+0

有趣的bug。你可以尝试使用mongo shell来运行该查询吗?如果这是一个数据库问题或node.js驱动程序问题,将会有所帮助,您应该从查找文档中移除$ query {} – 3rf

+1

@ 3rf是对的。 –

回答

4

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

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

然后查看是否.count()工作。

+2

这并不是说它们“阻止”游标助手,而是它们是制定命令或查询的两种不同方法,而且不能混合它们。附加到游标的count()方法在DBQuery被评估之前被翻译成别的东西。 –