Node.js Mongo计数聚合返回0
我有一个集合,其中包含数组属性的复合索引。我正在运行的查询是:Node.js Mongo计数聚合返回0,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个集合,其中包含数组属性的复合索引。我正在运行的查询是: db.servers.find({$query: { features: {$elemMatch: {'name':'a','status':'passed'}}}}).count() 此查询以前返回有效数字,但现在只返回0。如果删除count()命令,将得到一长串匹配项 问题与这里的问题类似- 到目前为止,我已经尝试重新启动、更新、运行repaireDatabase、运行reIndex、运行dropIndexes并让mongoo
db.servers.find({$query: { features: {$elemMatch: {'name':'a','status':'passed'}}}}).count()
此查询以前返回有效数字,但现在只返回0。如果删除count()命令,将得到一长串匹配项
问题与这里的问题类似-
到目前为止,我已经尝试重新启动、更新、运行repaireDatabase、运行reIndex、运行dropIndexes并让mongoose为我创建索引,以及运行mongodump和mongorestore。由于使用日志记录,我无法使用--repair标志运行mongod
日志文件中有数百行相同的警告-
警告:ClientCursor::yield无法解锁递归锁ns的b/c:
zrk.servers top:{opid:26,active:true,secs_running:9,op:
“查询”,ns:“zrk”,查询:{repairDatabase:1.0},客户端:
“127.0.0.1:49917”,描述:“conn1”,线程ID:“0x7f5dfb4c2700”,
connectionId:1,locks:{^:“W”},waitingForLock:false,numields:
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
}
如您所见,我通常使用此索引来选择随机文档。但是它也用于上面的find查询。我认为问题可能是您在find查询中使用了“$query”。不再需要将“$query”作为find命令的一部分,并且根据文档。尝试将查询重写为
db.servers.find({features:{$elemMatch:{'name':'a','status':'passed'}}})
然后看看.count()是否有效。我认为问题可能是您在查找查询中使用了“$query”。不再需要将“$query”作为find命令的一部分,并且根据文档。尝试将查询重写为
db.servers.find({features:{$elemMatch:{'name':'a','status':'passed'}}})
然后看看.count()是否有效。有趣的错误。您可以尝试使用mongo shell运行该查询吗?了解这是db问题还是node.js驱动程序会很有帮助issue@3rf是的,您应该从find文档中删除$query{}。有趣的bug。您可以尝试使用mongo shell运行该查询吗?了解这是db问题还是node.js驱动程序会很有帮助issue@3rf是的,您应该从find文档中删除$query{}。与其说它们“阻止”游标帮助器,还不如说它们是制定命令或查询的两种不同方式,您不能将它们混合使用。附加到游标的count()方法在计算DBQuery之前被转换为其他方法。与其说它们“阻止”游标帮助器,还不如说它们是制定命令或查询的两种不同方法,不能混合使用。在计算DBQuery之前,附加到游标的count()方法被转换为其他方法。