我正在尝试使用$addToSet
使用mongoose在mongo中将新对象插入到数组中:
我有两个型号:
var itemSchema = mongoose.Schema({
itemId: Number,
save_date: {type: Date, default: Date.now}
});
var UserSchema = new Schema({
...
items: [itemSchema]
});
var User = mongoose.model('User', UserSchema);
我想使用mongoose将item
添加到items
数组中,但前提是该项不存在。
目前,使用$addToSet
仍在添加重复内容,因为我认为每个项目的save_date标记不同:
User.findByIdAndUpdate(
id,
{$addToSet: {item: {itemId: newItem} } },
{upsert: true},
function (err, saveItem){
if (err) {return handleError(err)};
res.send(saveItem);
}
);
导致用户输入:
"name": "Vinnie James"
"items" : [
{
"itemId" : 123,
"_id" : ObjectId("587b10259233c524454d745d"),
"save_date" : ISODate("2017-01-15T06:01:09.850Z")
},
{
"itemId" : 123,
"_id" : ObjectId("587b17398ed7052b1e5196bc"),
"save_date" : ISODate("2017-01-15T06:31:21.263Z")
}
]
在添加条目之前是否可以检查itemId
是否存在,以避免上面提到两个"itemId": 123
?
如果有更好的方法来构建模型以获得相同的结果,我很高兴考虑到这一点
答案 0 :(得分:3)
尝试这种方式:
User.findOneAndUpdate(
{_id: id, "items.itemId": {$nin:[newItem.itemId]}},
{$push: {items: newItem }},
{new: true}
function (err, updatedUser){
if (err) {return handleError(err)};
res.send(updatedUser);
}
);
$nin
运营商将确保项目中没有itemId
newItem
的商品。然后,如果成功,newItem
运算符将添加$push
。 {new: true}
告诉mongo在提供的回调中传递更新的文档