Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB/Mongoose-仅当某个字段是唯一的时,才将对象添加到对象数组中_Javascript_Node.js_Mongodb_Mongoose_Subdocument - Fatal编程技术网

Javascript MongoDB/Mongoose-仅当某个字段是唯一的时,才将对象添加到对象数组中

Javascript MongoDB/Mongoose-仅当某个字段是唯一的时,才将对象添加到对象数组中,javascript,node.js,mongodb,mongoose,subdocument,Javascript,Node.js,Mongodb,Mongoose,Subdocument,因此,我在MongoDB文档中有一个嵌套的对象数组,我只想在某个字段(在本例中为eventId)唯一的情况下向数组中添加一个新对象。我的问题非常类似于,只是在我的案例中,我似乎无法得到有效的解决方案 以下是文档(UserModel)的外观: { "portal" : { "events" : [ { "important" : false, "completed" : false, "_id" : ObjectId("5c

因此,我在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'
,我相信在本例中它们在功能上是等效的)添加新对象

谁能给我指一下正确的方向吗

干杯,
Gabe

您需要在查询中包含您的
事件ID
签入条件部分。因为您正在使用,所以只能传递与
\u id
匹配的单个值作为条件。因此,您必须使用来指定自定义筛选条件,请尝试:

UserModel.findOneAndUpdate(
    { _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
    { $addToSet: { "portal.events": req.body } },
    { new: true }
);
如果查看方法上的参数,您将看到传递的参数顺序不正确

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 }
);

为什么不使用findOneAndUpdate并在查询中包含
$ne:req.body.eventId
?另外,findByIdAndUpdate只接受3个参数(如果是4个,最后一个参数将是回调),并且发送4个参数