2013-05-31 61 views
7

我是新來蒙戈,和我試圖從find()查詢檢索的第一個文檔:的MongoDB:檢索第一個文檔集合中

> db.scores.save({a: 99}); 
> var collection = db.scores.find(); 
[ 
    { "a" : 99, "_id" : { "$oid" : "51a91ff3cc93742c1607ce28" } } 
] 
> var document = collection[0]; 
JS Error: result is undefined 

這是一點都不奇怪,因爲集合看起來很像一個數組。我知道使用findOne()檢索單個文檔,但可以從集合中取出一個文檔嗎?

+1

嘗試'findOne()' – Tilo

+1

查找返回遊標而不是文檔。你可以添加.toArray()來查找()來將它變成一個數組,但是對於一個文檔,你應該像其他人所說的那樣使用findOne。 –

+0

@Asya - 感謝提到'toArray()'。這是在我的示例代碼中完成我想要執行的操作的一種方法,即使這不是最佳實踐: - \。 – dhulihan

回答

11

find方法返回一個遊標。這就像結果集中的迭代器一樣工作。如果結果太多並嘗試將它們全部顯示在屏幕上,那麼shell將僅顯示前20個,並且光標現在將指向結果集的第20個結果。如果您輸入it,則會顯示接下來的20個結果,依此類推。

在你的例子中,我認爲你已經隱藏了我們在shell中的一行。

此命令

> var collection = db.scores.find(); 

將只分配結果向collection變量,將無法打印在屏幕上的任何。所以,這讓我相信你也跑了:

> collection 

現在,究竟發生了什麼。如果您確實已使用上述命令顯示collection的內容,則光標將到達結果集的末尾(因爲您的集合中只有一個文檔),並且它會自動關閉。這就是爲什麼你找回錯誤。

您的語法沒有任何問題。您可以隨時使用它。只要確保你的光標仍然打開並有結果。您可以使用collection.hasNext()方法。

+0

謝謝你提供這個豐富的答案! – dhulihan

0

所以你可以有幾個選項。

使用Java作爲語言,但一種選擇是獲取數據庫遊標並遍歷返回的元素。或者只是抓住第一個並運行。

DBCursor cursor = db.getCollection(COLLECTION_NAME).find(); 
List<DOCUMENT_TYPE> retVal = new ArrayList<DOCUMENT_TYPE>(cursor.count()); 
while (cursor.hasNext()) { 
    retVal.add(cursor.next()); 
} 
return retVal; 

如果您正在查找文檔中的特定對象,可以編寫查詢並搜索所有文檔。您可以使用findOne方法或簡單地查找並獲取與您的查詢匹配的對象列表。見下:

DBObject query = new BasicDBObject(); 
query.put(SOME_ID, ID); 
DBObject result = db.getCollection(COLLECTION_NAME).findOne(query) // for a single object 
DBCursor cursor = db.getCollection(COLLECTION_NAME).find(query) // for a cursor of multiple objects 
0

那是Mongo shell嗎?什麼版本?當我嘗試鍵入命令,我沒有得到任何額外的輸出:

MongoDB shell version: 2.4.3 
connecting to: test 
> db.scores.save({a: 99}); 
> var collection = db.scores.find(); 
> var document = collection[0]; 

在蒙戈外殼,find()返回遊標,不是數組。在文檔中,您可以看到methods you can call on a cursor

findOne()返回單個文檔,並應爲您正在嘗試完成的工作。

+0

我的示例代碼是使用[mongodb.org](http://www.mongodb.org/)上的交互式shell運行的(http://www.mongodb.org/) – dhulihan

相關問題