2012-01-22 30 views
3

嗨我在MongoDB中遇到了一些麻煩。用java讀取文檔是沒有問題的,但要讀取數組中的內容是一個問題。可以說我有一個集合myCol:在mongodb中讀取數組?

{"name": "lenny linux", "gender": "m", "computers": [{"name": "computer"}, {"name": "computer2"} {"name"...}]} 

所以有一個數組與電腦。我可以

 DBCollection myCol = getCollection(...); 
     BasicDBObject query = new BasicDBObject(); 
     query.put(name, "lenny linux"); 

     DBCursor cursor = myCol.find(query); 
     while (cursor.hasNext()) { 
      System.out.print(cursor.next()); 
     } 

閱讀整個文檔,但我需要的只是計算機的名稱,所以我必須以某種方式讀取陣列。不要在MongoDB中得到這個數組的東西。還有,如果我想從MongoDB數組中刪除某些東西呢?它不同於刪除一個正常的文件...謝謝你的幫助!

編輯:如果即時讀取mongodb頁面:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray我真的不知道它。他們有一系列的顏色,然後他們像這樣讀取紅色:

db.things.find({ colors :"red" }); 

爲什麼要這樣做?如果我想讀一個數組來知道數組內部是什麼。用戶不知道有「紅色」或藍色或其他。也許陣列顏色是空的?然後我得到一個null,0或其他什麼,如果有4種顏色,然後給我這些顏色,打印出來。我沒有其他的例子...我很抱歉我的英語不好。

EDIT2: 好了,所以對我來說是新的解決方案是讓整個文檔,其中name ==萊尼的Linux(如在我的代碼中的第一次),然後以這個文件與一個外部JSON解析器解析一樣json-simple。那麼也許這不是最好的解決方案,因爲最好的解決方案是獲取數組中的東西,而不使用其他庫,只是使用mongolib ...但確定它的工作:)如果有人知道一個更簡單的方法只是發佈在這裏。謝謝。

+0

這裏有什麼問題? – milan

+0

如果我這樣做我回來一個整個文件與id,名稱,性別和一切。但我只想獲得數組中的名稱。因此,一個System.out.print(myFunctionToReadComputersFrom(「lenny linux」))應該打印出來:computer,computer2,... – OverStack

+1

這就是mongodb的工作原理,它存儲文檔,讓我們來查詢文檔。一個文件,你必須把它拉出來 – milan

回答

1

而且如果我想從MongoDB 數組中刪除某些東西呢?它與刪除普通文檔不一樣。

http://www.mongodb.org/display/DOCS/Updating說明2種方式:

  • $設置:替換當前陣列用一個新的(讀取前陣列,刪除元素或兩個,並用$集合更新)

  • db.users.update({name : "lenny linux"}, {$pull : { computers : { name : "computer2" } }}, false, false)刪除全部來自陣列computers的元素具有name'computer2'。

1

當使用對象(命名元素)到達數組時,您希望使用點符號到達數組。

db.myColl.find({'computers.name':'computer'});

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

爲從陣列中刪除的項目,你想看看$pop$pull更新功能

http://www.mongodb.org/display/DOCS/Updating

+0

很抱歉,我沒有明白,真的。 'db.myCol.find()'應該如何工作?我甚至不知道陣列中有什麼。我不能寫find(電腦,名字),因爲我不知道數組裏面的電腦的名字。這就是爲什麼我想閱讀整個陣列。 – OverStack

+0

花一些時間去做[MongoDB教程http://www.mongodb。org/display/DOCS/Tutorial]不需要很長時間,您將更好地理解文檔是如何(或可以)結構化的,以及如何搜索和查找您想要的內容。 – lhagemann

0

自從我處理這個問題, Java和你的代碼是在Java中,這裏是解決方案... in java

基本上,當你使用一個MongoDB數組get(key)時,它會返回一個com.mongodb.BasicDBList對象,你可以獲得一個迭代器。

在我的代碼,我查詢看起來像這樣的文件:

{ 
    "_id": ObjectID("52d60db91f3aa664410bcde5"), 
    "owner": "Amy", 
    "trusted": [ 
     "amy", 
     "paul", 
     "randy" 
    ] 
} 

當我以往任何時候都需要找到這個文件的信任的人,我用((BasicDBList) doc.get("trusted")).listIterator();

 DBObject doc = collection.findOne(new BasicDBObject("owner", "Amy")) 
     ListIterator<Object> trustedList = ((BasicDBList) doc.get("trusted")).listIterator(); 

     while(trustedList.hasNext()){ 
      Object nextItem = trustedList.next(); 
      System.out.println(nextItem.getClass()); // String 
      // Here I handle what to do to each name. 
      // I could add them to an ArrayList<String> if I needed 
      updateTrustee((String)nextItem); 
     } 

我來這個解決方案使用幾個System.out.println(Object.getClass())來知道我需要投些什麼類。

0

他問的問題是如何返回存儲在Mongo集合中的數組中找到的所有元素,而不知道這些元素可能有多少或什麼內容。您沒有針對已知值執行查詢,而只是要求轉儲Mongo數組中的內容。例如,如果您的Mongo數組名稱是「顏色」,只需執行以下操作:

@colors = @ {$ record - > {colors}};

現在你已經擁有Perl數組中的所有顏色供你玩了。

享受!