2012-01-10 45 views
4

我喜歡蒙古文deadbeef,但我很難過。我希望得到一個簡單的.find()的結果在同一個JSON格式蒙戈的命令行的輸出相匹配返回:Mongolian DeadBeef .toArray()以意想不到的格式返回_id

$ db.mycollection.find(); 
# outputs.. 
# { ...some data... , "_id" : ObjectId("4f0b371c0000008b6d000008") } 
與deedbeef

不過,.find()方法不返回結果或提供回調。 所以我一直在使用.toArray();這對我來說似乎是正確的。

Mongolian = require("mongolian"), 
server = new Mongolian, 
db = server.db("mydatabase"), 
mycollection = db.collection("mycollection"), 

mycollection.find().toArray(function(err, data){ 
    res.write(JSON.stringify(data)); 
}); 

// outputs.. 
// { ...some data... , _id: { bytes: <Buffer 4f 0b 61 5a 00 00 00 7e 6e 00 00 06> } } 

刺痛_id二進制(我認爲這是什麼緩衝區)導致一個公制@#$!噸的數據。從mycollection.find()返回JSON的正確方法是什麼?

~~~~~~~

我已經能夠使用後續剝離從結果_id:

mycollection.find({}, { id:0 }).toArray(function(err, data){ 
    res.write(JSON.stringify(data)); 
}); 

然而如何處理從轉換_id更大的問題JSON到BSON仍然存在。

+0

剛纔問啞巴問題,deedbeef.find在第二段應該是deadbeef吧?錯別字是最差的橡皮鴨錯誤 – jcolebrand 2012-01-10 22:31:24

+0

@Asa - 在這裏得到了同樣的結果 - 看起來至少有10公制@#!!噸) – UpTheCreek 2012-05-02 20:02:10

回答

3

問題是'data'是文檔對象的數組,但並非所有的數據都具有與JSON兼容的格式。

看這裏:https://github.com/marcello3d/node-mongolian 在BSON數據類型部分。

它看起來像您的文檔具有'ObjectId'類型,因此您需要在轉換爲JSON之前刪除ObjectId數據,或者您需要將數據轉換爲可用的格式。

+0

我可以找到BSON的唯一參考(https://github.com/marcello3d/node-mongolian/blob/master/lib/cursor.js)。我看錯了地方? ObjectId通過一個非常簡單的保存功能 'mycollection.save({「foo」:「bar」});' 我會想通過允許mongo創建_id,那麼_id會自動設置與JSON兼容,需要解析查詢的結果。 – 2012-01-11 03:47:58

+0

是的,BSON邏輯全部由node-buffalo處理。 ObjectID的代碼在這裏:https://github.com/marcello3d/node-buffalo/blob/master/lib/objectid.js我想你可能只需要做數據['__ id']。將每個記錄上的toString()轉換爲十六進制,然後再轉換爲JSON。 – loganfsmyth 2012-01-11 04:31:58

+0

Yikes,更新操作有什麼意義?我將如何能夠將_id字符串重新轉換回BSON? – 2012-01-11 04:55:46