2014-09-25 78 views
0

我有兩個集合(用戶和書籍)運行的mongodb(MEAN環境)。其中一個集合(myusers)的包含的ObjectID數組(引用藏書的文件)本身:與新書的IDSMongodb/Mongoose:填充ObjectIds數組

var UserSchema = new Schema({ 
    [...], 
    externalids: [{type: Schema.Types.ObjectId, ref: 'Books', required: false}] 
    }, {collection: 'myusers'}); 

在運行時,我想不斷地填補陣列(外部ID)文檔。這就是我要做的事:

var newBook = new Book({ ... }); 

     newBook.save(function (err){ 
       if (err){ 
        //whatever 
       }else{ 
        User.update({ _id: req.user._id }, { $set: { externalids: newBook._id }}, function(err){ 
         //whatever  
        }); 
       } 
     }); 

不幸的是,我不能使用類似:

externalids: externalids.push(newBook._id) 

我甚至嘗試:

User.update({ _id: req.user._id }, { $push: { externalids: newBook._id }} 

但是,如果沒有幫助。 因此,該數組總是隻包含一個值(最新)並且不會被填滿。有沒有快速添加更多值的方法?將是很好,如果有比第一讀取陣列的內容,將其存儲到本地臨時數組更快的方法,追加新的價值和整個陣列寫回... 乾杯

伊戈爾

+1

即使使用$ push,您仍然只能獲得數組中的一個項目? – 2014-09-25 22:24:03

+0

不,使用$ push不會改變任何東西!?甚至不改變單個項目... – 2014-09-25 22:29:51

+0

是newBook._id一個ObjectId或字符串表示? – 2014-09-25 22:34:59

回答

0

嘗試$ addToSet而不是$ push,以避免重複的id。

User.update({ _id: req.user._id }, { $addToSet : { externalids: newBook._id }} 

您可能會遇到的問題是您之前使用$set來更新用戶。這最初將創建externalids作爲字符串,而不是數組,因此您以後不能在externalids上使用$push/$addToSet。若要更正此問題,請嘗試首先將您的用戶externalids更新爲數組:

User.update({ _id: req.user._id }, { $set : { externalids: [] }} 
+0

謝謝!你是對的。由於我在此期間使用了$ set,所以externalids字段的類型被轉換爲OID,因此無法再繼續推送。刪除用戶文檔並創建一個新文檔(現在使用$ push或$ addToSet)後,它工作得很好。 – 2014-09-25 23:19:06