因此,我的MongoDB文档中有一个嵌套的对象数组,并且仅当某个字段(在本例中为eventId)唯一时,我才想向该数组添加一个新对象。我的问题与this post非常相似,只是我似乎无法获得适用于我的情况的解决方案。
这是文档(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'
,在这种情况下,我认为它们在功能上是等效的)添加新对象。
有人能指出我正确的方向吗?
干杯, 加布(Gabe)
答案 0 :(得分:2)
如果您在方法上查看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 }
);
答案 1 :(得分:1)
您需要将eventId
检查纳入查询的条件部分。由于您使用findByIdAndUpdate,因此只能传递与_id
匹配的单个值作为条件。因此,您必须使用findOneAndUpdate来指定自定义过滤条件,请尝试:
UserModel.findOneAndUpdate(
{ _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
{ $addToSet: { "portal.events": req.body } },
{ new: true }
);