Javascript Mongodb/Mongoose:填充ObjectID数组(引用)
我有一个运行MEAN环境的mongodb,它有两个collections用户和两本书。其中一个集合myusers包含对图书集合文档的ObjectID引用数组,例如:Javascript Mongodb/Mongoose:填充ObjectID数组(引用),javascript,arrays,node.js,mongodb,mongoose,Javascript,Arrays,Node.js,Mongodb,Mongoose,我有一个运行MEAN环境的mongodb,它有两个collections用户和两本书。其中一个集合myusers包含对图书集合文档的ObjectID引用数组,例如: var UserSchema = new Schema({ [...], externalids: [{type: Schema.Types.ObjectId, ref: 'Books', required: false}] }, {collection: 'myusers'}); 在运行时,我希望不断用新
var UserSchema = new Schema({
[...],
externalids: [{type: Schema.Types.ObjectId, ref: 'Books', required: false}]
}, {collection: 'myusers'});
在运行时,我希望不断用新书文档的ID填充数组externalID。我就是这样做的:
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 }}
但这也没用。
因此,数组始终只包含一个最新的值,不会被填充。是否有一种快速方法可以附加更多值?如果有比先读取数组内容、将其存储到本地临时数组、追加新值并写回整个数组更快的方法,那就太好了。。。
干杯
Igor尝试$addToSet而不是$push,以避免重复id
User.update({ _id: req.user._id }, { $addToSet : { externalids: newBook._id }}
可能的问题是,您以前使用$set更新用户。这将首先以字符串而不是数组的形式创建ExternalId,因此以后不能在ExternalId上使用$push/$addToSet。要更正此问题,请首先尝试将用户ExternalID更新为数组:
User.update({ _id: req.user._id }, { $set : { externalids: [] }}
即使使用$push,数组中仍然只有一个项目?不,使用$push不会改变任何东西!?甚至不改变单个项目…是newBook.\u id是ObjectId还是字符串表示形式?就是这样做的$push语句。确保您提供了一个回调来更新和检查错误。根据robomongo的说法,文档中存储的项目是Objectd5424…谢谢!你是对的。同时,由于我使用了$set,externalId字段的类型被强制转换为OID,因此无法再推送。删除用户文档并创建一个新文档后,现在使用$push或$addToSet,它就可以正常工作了。