Vin*_*mes 1 mongoose mongodb node.js express
我正在尝试使用$addToSetmongoose 将新对象插入到 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);
Run Code Online (Sandbox Code Playgroud)
我想使用 mongoose 将一个添加item到items数组中,但前提是该项目不存在。
目前, using$addToSet仍在添加重复项,因为我认为每个项目的 save_date 戳都不同:
User.findByIdAndUpdate(
id,
{$addToSet: {item: {itemId: newItem} } },
{upsert: true},
function (err, saveItem){
if (err) {return handleError(err)};
res.send(saveItem);
}
);
Run Code Online (Sandbox Code Playgroud)
这会导致用户输入:
"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")
}
]
Run Code Online (Sandbox Code Playgroud)
是否可以itemId在添加条目之前检查是否存在,以避免"itemId": 123出现如上所示的两个?
如果有更好的方法来构建模型以实现相同的结果,我也很乐意考虑
试试这个方法:
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);
}
);
Run Code Online (Sandbox Code Playgroud)
$nin操作员将确保项目中没有与 相同itemId的项目newItem。然后,如果成功,newItem将由$push运营商添加。{new: true}告诉 mongo 在提供的回调中传递更新的文档
| 归档时间: |
|
| 查看次数: |
1682 次 |
| 最近记录: |