2012-05-09 92 views
25

我正在用貓鼬來操作mongodb。現在,爲了測試,我想通過本地連接將一些數據插入到mongodb中。如何使用mongoose將文檔插入到mongodb中並獲取生成的ID?

但問題是如何獲得插入後生成的ID?

我想:

var mongoose = require('mongoose'); 

mongoose.connect('mongo://localhost/shuzu_test'); 

var conn = mongoose.connection; 

var user = { 
    a: 'abc' 
}; 

conn.collection('aaa').insert(user); 

console.log('User:'); 
console.log(user); 

但它打印:

{ a: 'abc' } 

沒有_id場。

回答

36

您可以自己生成_id並將其發送到數據庫。

var ObjectID = require('mongodb').ObjectID; 

var user = { 
    a: 'abc', 
    _id: new ObjectID() 
}; 

conn.collection('aaa').insert(user); 

這是我最喜歡的MongoDB功能之一。如果您需要創建多個彼此鏈接的對象,則無需在應用程序和數據庫之間進行多次往返。您可以在應用程序中生成所有ID,然後插入所有內容。

+0

沒有新的對象ID()需要做一個往返得到一個「可用」 ID ...否則,會不會有一個非常小的碰撞機會? ((例如,在MSSQL上,NEWID()符合RFC4122 ...並確保沒有衝突,但它發生在DB端)) –

+0

我做了一些進一步的研究,並且遇到了這個SOQuestion [https:// stackoverflow.com/a/5694803/1327508],它解釋了oid是如何生成的以及3(+1評論)場景中的碰撞......我的答案基本上是「不,你是正確的」,因爲oid是如何生成的。 –

7

如果您使用.save,則會在回調函數中返回_id。

var user = new User({ 
    a: 'abc' 
}); 

user.save(function (err, results) { 
    console.log(results._id); 
}); 
0

您可以使用Update方法與UPSERT:true選項

aaa.update({ 
    a : 'abc' 
}, { 
    a : 'abc' 
}, { 
    upsert: true 
}); 
相關問題