我有一个集合,其中包含数组属性的复合索引。我正在运行的查询是:
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
}
如您所见,我通常使用此索引来选择随机文档。但它也用于上述查询。
答案 0 :(得分:4)
我认为问题可能是您在查找查询中使用“$ query”。不再需要使用“$ query”作为find命令的一部分,并且根据文档prevents cursor helpers from working。尝试将查询重写为
db.servers.find({features:{$elemMatch:{'name':'a','status':'passed'}}})
然后查看.count()是否有效。