2016-09-19 30 views
0

我有一個帶有整數數組的文檔的集合。我試圖找到一個設置/數字是否存在於集合中的任何位置。在它的外殼工作正常:Mongo 3.2 Java驅動程序 - 查找和計算操作

> db.col.find({ settings: { $elemMatch: { $eq : 310403 } } }).count() 
1 
> db.col.find({ settings: { $elemMatch: { $eq : 310403 } } },{_id:1}) 
{ "_id" : 897 } 
> db.albums.find({ images: { $elemMatch: { $eq : 310404 } } }).count() 
0 

但我不能讓它通過Java驅動程序工作。但我不知道如何判斷發現實際上是否找到了某種東西。

FindIterable<Document> checkForSetting; 
for (int i = 0; i < 1000000; i++) { 
       checkForSetting = col.find(new Document("settings",new Document("$eleMatch",new Document("$eq",i)))).projection(new Document("_id",1)); 
       if (null, empty, not found,etc) { 
        ...do something 
       } 
} 

我覺得我在某種程度上使得它比應該更難。在shell中,這是一件不容易的事情。我真的很討厭必須迭代每個集合的文檔來檢查數組中是否存在數字,但我已經花費更多時間試圖找到「有效」的方式,而不是蠻橫的方式。

+1

您在Java代碼中使用'$ eleMatch'而不是'$ elemMatch'。這可能是問題嗎? 而對於性能,我會看看聚合方法,並將結果按id與後面的計數進行彙總。這可以通過一個請求來完成 – neomega

+0

對不起,這是一個複製/粘貼錯誤。 – stackbacker

回答

1

基本上,你有兩種不同的情況:

(一)通過收集迭代,並準備好結果的每一個數字。這是你使用find和你在問題中聲明的FindIterable的地方。

(二)獲取的數量,這是完全一樣在你的shell例如:

col.count(<whateverfilter>) 

順便說一句:你真的應該看看的實用程序類的過濾器和預測。你的代碼使用舊的和醜陋的風格,這對於java驅動程序的3.x系列不再是必需的。

+0

謝謝,我被掛上了「找到」那麼「數」!我感到困惑的是有關從Mongo 3.0中刪除count的評論(http://stackoverflow.com/questions/32683458/how-to-call-count-operation-after-find-with-mongodb-java-driver),但簡直不敢相信司機中不存在這樣一個有用的功能。 – stackbacker