MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中
Posted
技术标签:
【中文标题】MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中【英文标题】:MongoDB/Mongoose - Adding an object to an array of objects only if a certain field is unique 【发布时间】:2019-05-10 06:19:49 【问题描述】:所以我的 MongoDB 文档中有一个嵌套的对象数组,并且我想仅在某个字段(在本例中为 eventId)是唯一的情况下才向该数组添加一个新对象。我的问题与this post 非常相似,只是我似乎无法让该解决方案适用于我的情况。
这是文档 (UserModel
) 的样子:
"portal" :
"events" : [
"important" : false,
"completed" : false,
"_id" : ObjectId("5c0c2a93bb49c91ef8de0b21"),
"eventId" : "5bec4a7361853025400ee9e9",
"user_notes" : "My event note"
,
...and so on
]
这是我的(到目前为止不成功的)Mongoose 操作:
UserModel.findByIdAndUpdate(
userId,
"portal.events.eventId": $ne: req.body.eventId ,
$addToSet: "portal.events": req.body ,
new: true
);
基本上我正在尝试使用'$ne'
来检查该字段是否唯一,然后使用'$addToSet'
(或'$push'
,我相信在这种情况下它们在功能上是等效的)来添加新对象。
谁能指出我正确的方向?
干杯, 加布
【问题讨论】:
为什么不使用 findOneAndUpdate 并在查询中包含$ne: req.body.eventId
?另外,findByIdAndUpdate 只接受 3 个参数(如果是 4,最后一个将是回调),而您正在发送 4 个参数
【参考方案1】:
如果您查看方法中的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
);
【讨论】:
【参考方案2】:您需要在查询的条件部分中包含您的eventId
检查。因为您使用findByIdAndUpdate,所以您只能传递与_id
匹配的单个值作为条件。所以你必须使用findOneAndUpdate来指定自定义过滤条件,试试:
UserModel.findOneAndUpdate(
_id: userId, "portal.events.eventId": $ne: req.body.eventId ,
$addToSet: "portal.events": req.body ,
new: true
);
【讨论】:
以上是关于MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段
mongoDb/Mongoose:使 emailId 唯一字段[重复]