Mongodb / Mongoose:填充ObjectIds数组(引用)

时间:2014-09-25 22:10:02

标签: javascript arrays node.js mongodb mongoose

我有一个mongodb运行(MEAN环境),有两个集合(用户和书籍)。其中一个集合(myusers)包含一系列Objectids(对书籍集合的文献的引用):

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

在运行时,我想不断地用新书文档的ID填充该数组(externalids)。我就是这样做的:

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 个答案:

答案 0 :(得分:0)

尝试$ addToSet而不是$ push以避免重复ID。

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

您可能遇到的问题是您之前使用$set来更新用户。这最初会将externalid创建为字符串,而不是数组,因此您之后不能在externalids上使用$push/$addToSet。要更正此问题,请先尝试将用户externalids更新为数组:

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