MongoDB/Mongoose - 仅当特定字段唯一时才将对象添加到对象数组
MongoDB/Mongoose - Adding an object to an array of objects only if a certain field is unique
所以我的 MongoDB 文档中有一个嵌套的对象数组,我想仅当某个字段(在本例中为 eventId)唯一时才向该数组添加一个新对象。我的问题与 非常相似,只是我似乎无法使该解决方案适用于我的情况。
文档 (UserModel
) 如下所示:
{
"portal" : {
"events" : [
{
"important" : false,
"completed" : false,
"_id" : ObjectId("5c0c2a93bb49c91ef8de0b21"),
"eventId" : "5bec4a7361853025400ee9e9",
"user_notes" : "My event note"
},
...and so on
]
}
}
这是我的(迄今为止未成功)猫鼬操作:
UserModel.findByIdAndUpdate(
userId,
{ "portal.events.eventId": { $ne: req.body.eventId } },
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);
基本上我尝试使用'$ne'
来检查该字段是否是唯一的,然后'$addToSet'
(或'$push'
,我相信在这种情况下它们在功能上是等价的)添加新对象。
谁能给我指出正确的方向?
干杯,
加布
您需要在查询中包含 eventId
签入条件部分。因为你是用findByIdAndUpdate you can only pass single value matched against _id
as a condition. Therefore you have to use findOneAndUpdate来指定自定义过滤条件,试试:
UserModel.findOneAndUpdate(
{ _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);
如果您查看方法中的 documentation,您会发现传递的参数顺序不正确。
findByIdAndUpdate(id, update, options, callback)
我会改用 update
,让你的 id
和 portal.events.eventId": { $ne: req.body.eventId }
部分成为初始过滤器,然后是 $addToSet: { "portal.events": req.body }
这些行中的内容:
UserModel.update(
{
"_id": mongoose.Types.ObjectId(userId),
"portal.events.eventId": { $ne: req.body.eventId }
},
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);
所以我的 MongoDB 文档中有一个嵌套的对象数组,我想仅当某个字段(在本例中为 eventId)唯一时才向该数组添加一个新对象。我的问题与
文档 (UserModel
) 如下所示:
{
"portal" : {
"events" : [
{
"important" : false,
"completed" : false,
"_id" : ObjectId("5c0c2a93bb49c91ef8de0b21"),
"eventId" : "5bec4a7361853025400ee9e9",
"user_notes" : "My event note"
},
...and so on
]
}
}
这是我的(迄今为止未成功)猫鼬操作:
UserModel.findByIdAndUpdate(
userId,
{ "portal.events.eventId": { $ne: req.body.eventId } },
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);
基本上我尝试使用'$ne'
来检查该字段是否是唯一的,然后'$addToSet'
(或'$push'
,我相信在这种情况下它们在功能上是等价的)添加新对象。
谁能给我指出正确的方向?
干杯, 加布
您需要在查询中包含 eventId
签入条件部分。因为你是用findByIdAndUpdate you can only pass single value matched against _id
as a condition. Therefore you have to use findOneAndUpdate来指定自定义过滤条件,试试:
UserModel.findOneAndUpdate(
{ _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);
如果您查看方法中的 documentation,您会发现传递的参数顺序不正确。
findByIdAndUpdate(id, update, options, callback)
我会改用 update
,让你的 id
和 portal.events.eventId": { $ne: req.body.eventId }
部分成为初始过滤器,然后是 $addToSet: { "portal.events": req.body }
这些行中的内容:
UserModel.update(
{
"_id": mongoose.Types.ObjectId(userId),
"portal.events.eventId": { $ne: req.body.eventId }
},
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);