2014-04-03 32 views
0

我有一個集合'placements',每個文檔都有字段:placement_id,program_id,category,...我需要找到所有具有program_id = 3的展示位置,並且只返回placement_id列表, 我可以從蒙戈命令行做這樣的:java中的mongodb光標貼圖函數

db.placements.find({program_id:{$in: [3]}}, {placement_id:1, _id:0}).map(function(doc){return doc.placement_id}) 

它一個數組中返回placement_ids:

[196, 197, 198...] 

,但我怎樣才能在Java中實現上面的查詢,我查了MongoDB中的Java API的DBCursor類,它沒有任何作爲'map'或'forEac的函數H'。

+0

如果只是提取位置ID,則可以遍歷query- db.placements.find({program_id:{$ in:[3]}}的光標輸出,{placement_id:1,_id: 0}) – hellboy

+0

查詢返回{「placement_id」:196} {「placement_id」:197} {「placement_id」:198} ...,這不是我想要 – user468587

回答

0

DBCursor.next返回DBOBject其中有一個get方法,您可以使用該方法將值推送到數組。
我在想這樣的事情。 (未測試)

List<Integer> placementIdList = new ArrayList<Integer>(); 
while (cursor.hasNext()) { 
    DBObject obj = cursor.next(); 
    int id = obj.get("placement_id"); 
    placementIdList.add(id); 
} 

UPDATE:
上爲map執行數據庫端的實現非常類似於上面。

mongos> db.test.find().map 
function (func){ 
    var a = []; 
    while (this.hasNext()) 
     a.push(func(this.next())); 
    return a; 
} 

因此,無論是在db還是在Java層。
在db中執行它的好處是可以在整個線路上傳輸更小的數據包(較少的序列化/反序列化成本),而在Java中執行它可以充分利用JVM的處理能力。

+0

確定它的工作原理,只是想知道是否有一些mongo內建函數讓我更有效地做到這一點。當集合中有數百萬個文檔時,該循環可能非常緩慢。 – user468587

+0

我明白你的關心。添加了一個可能解決其中一些問題的更新。 –