2013-03-23 87 views
2

我已返回3個結果解析AggregationOutput蒙戈Java驅動程序

{ "serverUsed" : "/127.0.0.1:27017" , "result" : [ { "_id" : "luke" , "times" : 56} , { "_id" : "albert" , "times" : 28} , { "_id" : "matt" , "times" : 28}] , "ok" : 1.0} 

但是當我試圖遍歷結果,代碼進入無限循環合計(不明白爲什麼!!)

AggregationOutput output = coll.aggregate(match1, unwind, match2, group, sort, limit); 

Iterable<DBObject> list= output.results(); 
     while(list.iterator().hasNext()){ 

      String id = (String) list.iterator().next().get("_id"); 
      int times = Integer.parseInt(list.iterator().next().get("times").toString()); 

      System.out.println("ID IS "+id+" time: "+times); 
     } 

而且輸出重複的第一個結果:

ID IS luke time: 56 
ID IS luke time: 56 
ID IS luke time: 56 
ID IS luke time: 56 
ID IS luke time: 56 
... 

我真的不;噸明白爲什麼這個迭代不起作用。請幫忙!

回答

5

看來您每次訪問DBObject中的字段時都使用新的迭代器,即您在循環中多次使用list.iterator()list.iterator().next()返回集合中的第一個元素。所以你最終訪問第一個DBObject

試試這個:

Iterable<DBObject> list= output.results(); 
while(list.iterator().hasNext()){ 
    DBObject obj = list.iterator().next(); 
    String id = obj.get("_id"); 
    int times = Integer.parseInt(obj.get("times").toString()); 

    System.out.println("ID IS "+id+" time: "+times); 
} 

或許使用foreach循環:在你的代碼

for (DBObject obj : output.results()) { 
    String id = obj.get("_id"); 
    int times = Integer.parseInt(obj.get("times").toString()); 
    System.out.println("ID IS "+id+" time: "+times); 
} 
+1

每個作品!!!謝謝!我完全是FUSE工作太多:( – nuvio 2013-03-23 20:33:48

+0

@nuvio不客氣,很高興幫助你!:) – tenorsax 2013-03-23 20:35:16

1

一個可能的缺陷是您呼叫Iterator.next()方法多次。將其值存儲在變量中,並使用變量而不是多次調用。

如:

DBObject obj = list.iterator().next(); 
String id = (String) obj.get("_id"); 

int times = Integer.parseInt(obj.get("times").toString());` 
3

我知道,這是一個古老的線程,並且它已經被回答,但答案是優化。實際的原因爲什麼你得到的重複答案是,每次你請求.iterator()時,它都會返回一個從列表頂部開始的迭代器對象。

所以while循環條件:

list.iterator().hasNext() 

將始終返回true。相應的,後續的

list.iterator().next() 

將始終返回第一個元素。

應該怎樣做是這樣的:

AggregationOutput output = coll.aggregate(match1, unwind, match2, group, sort, limit); 
Iterable<DBObject> list= output.results(); 
Iterator<DBObject> iterator= list.iterator(); 

while(iterator.hasNext()){ 
    DBObject obj = iterator.next(); 

    String id = (String) obj.get("_id"); 
    int times = Integer.parseInt(obj.get("times").toString()); 

    System.out.println("ID IS "+id+" time: "+times); 
} 

但在技術上,在由@Aqua提到循環是很多清潔劑使用。這個答案只是爲了澄清爲什麼,而不是如何。