2011-05-20 135 views

回答

33

我使用貓鼬版本1.2.0,只要我創建了一個貓鼬模型的新實例,_id已經設置。

coffee> u = new User() 
[object Object] 
coffee> u._id 
4dd68fc449aaedd177000001 

我也驗證了我稱之爲u.save()_id保持不變。我通過MongoHub驗證這確實是保存到MongoDB中的真實ID。

+0

很好聽!謝謝你的測試! – Tronic 2011-05-20 16:58:34

0

對於MongoDB,如果您沒有明確設置文檔的_id值,則客戶端驅動程序會自動將其設置爲ObjectId的值。這與可能在服務器上生成ID並需要其他查詢來檢索它的數據庫不同,例如SQL Server的scope_identity()或MySQL的last_insert_id()

這使您可以異步插入數據,因爲在繼續之前不需要等待服務器返回_id的值。

所以,如圖所示是彼得的回答,_id在文檔被保存到數據庫之前是可用的。

3

如果您想要獲取子對象的最後一個插入_id,則創建該對象並將其添加到該項目。下面是使用的MongoDB和貓鼬(添加一些架構糖),然後將結果轉換爲JSON發送回客戶端NowJS一個例子:

   var nowRoomID = this.now.room; 
       var Conversation = mongoose.model('Conversation'); 
       Conversation.findById(convID, function(error, conversation) { 
        var Blip = mongoose.model('Blip'); 
        var createdBlip = new Blip(); 
        createdBlip.author= nowUserName; 
        createdBlip.authorid = parsed.authorid; 
        createdBlip.body = revisedText; 
        createdBlip.created_at = new Date(); 
        createdBlip.modified_at = new Date(); 

        conversation.blips.push(createdBlip); 
        parsed._id = createdBlip._id; //NOTE: ID ACCESSED HERE 
        message = JSON.stringify(parsed); 

        conversation.save(function (err) { 
         if (!err) { 
          console.log('Success - saved a blip onto a conversation!'); 
          nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message); 
         } 

        }); 
0

我剛從傳遞給回調的文件拿到ID,自保存返回保存的文件。

5

如果你明確聲明

_id: Schema.ObjectId 

您的機型,那麼的ObjectId將無法使用後,新的或保存。 這可能是一個錯誤。

+1

我確認這個錯誤。 – Olivier 2012-12-28 16:03:14