2014-01-18 254 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被評估之前被翻譯成別的東西。 –