2013-10-17 164 views
0

我在我的數據庫中調用例如集合,看起來像這樣:MongoDB的光標返回null

{ 
    "event" : "cheat", 
    "message" : { 
     "tableid" : 398, 
     "time" : 1381853438870, 
     "link" : "/dbcheat/table398/iID485" 
    }, 
    "_id" : ObjectId("525d68fe99ddc6a019000008") 
} 

有成千上萬的這樣的記錄,我想尋找前50的實例。

我研究過,最好的方法是使用forEach()函數。我習慣於SQL,剛開始使用Mongo,並明白objectID是唯一的,但我無法從中獲得訂單。

var cursor = db.example.find(); 
cursor.forEach(function(x){ 

    console.log(x.message); 

}); 

但我得到一個錯誤,因爲某些原因,因爲x總是空的。

任何想法可能是錯誤的?

+0

我不明白你想達到什麼目的,你想獲得所有的記錄還是第一個50? –

+0

你在mongo shell上運行這個函數嗎? –

+0

@LucianEnache那麼最終的目標是獲得第一個x數量的記錄,但現在我想將它們全部打印出來。但是當我這樣做時x總是空的。 – vcazan

回答

1

必須在find()方法的功能(錯誤,光標)以及光標中添加處理程序,認爲錯誤是零和光標存在,那麼你做cursor.toArray(功能(錯誤數據))

在第一個中,您必須等待數據出現並期望出現錯誤。 在第二個中,光標將變成一個可用的jsons數組:>這就是你需要的。

db.example.find(function(error, cursor) 
{ 
    if(error || !cursor) 
    { 
     console.log("error getting items"); 
    } 
    else 
    { 
     cursor.toArray(function(error, items) 
     { 
      if(error || !items) 
      { 
       console.log("error getting items"); 
      } 
      else 
      { 
       console.log(JSON.stringify(items)); 
      } 
     }); 
    }); 
} 
+0

好吧,我改變了我的功能,這似乎工作,但最後一行是一個錯誤。我怎麼處理這個db.example.find()。forEach(function(error,x){ – vcazan

+0

http://pastie.org/8409620 – Discipol

+0

db.example.find()這段代碼有一個語法錯誤,我不知道爲什麼。在第二個最後一行缺少a} – vcazan

0

要查看「前50」,您可能希望按時間對文檔進行排序,並將查詢結果限制爲最初的50個。

db.coll.find().sort({"message.time":1}).limit(50) 

然後,您可以在遊標上使用toArray()方法並訪問該數組中的文檔。

+0

我試圖在保存後讀取arry的值,但我一直未定義? var last50 = db.example.find()。sort({「message.time」: - 1})。limit(50).toArray(); console.log(last50 [0]); – vcazan

+0

看不到原因,查詢對我來說工作正常。你可以先嚐試在mongo shell中,沒有toArray(),並檢查你是否看到任何結果? – drmirror

0

要打印你可以只使用像圖案的第一X號:

db.example.find().limit(x); 

其中x是一個整數指定集合

的第一x元素如果你想獲得他們都只是使用

db.example.find() 

而如果你想跳過第一y元素和打印下一x使用類似

db.example.skip(y).limit(x); 

也有一些排序,你可以使用時間字段。