将项目添加到数组(如果不存在)

时间:2019-09-26 15:43:17

标签: node.js mongodb

我正在使用mongoDB + nodejs运行一个简单的应用程序,我正在尝试实现以下目标:

单元属于一个公司教室属于一个单元,并且用户属于教室

在某个时刻,我想将用户添加到另一个单元或/和教室,那么他将属于2个或多个单元/教室。

我的表单每次只会发送一个单元/教室,在这种情况下,我想将其添加到用户模型unit:[string]classroom:[string]中,前提是他以前不属于该模型。因此,我需要检查数组是否已经具有发送的数据,如果没有,则将其添加。

Mongo具有$addToSet属性和$ne属性,但我似乎无法使其正常工作。

这是我的代码:

User.findById(req.body._id)
    .select("-__v")
    .exec((err: Error, user: any) => {
            if (err) {
                // display error
            }
            if (!user) {
                // display error
            }
            user.update({
                unit: {
                    $ne: user.unit
                },
                classroom: {
                    $ne: user.classroom
                }
            }, {
                $addToSet: {
                    unit: req.body.unit,
                    classroom: req.body.classroom
                }
            }).exec((err: Error) => {
                if (err) {
                    // Display error
                }

                res.status(200).json({
                    status: "OK",
                    response: response,
                })
                return
            })

enter image description here

它属于“ Academy One”和教室ID参考,我将把他添加到“ Academy 2”之类的另一个单元中并添加另一个教室参考,但是如果我将他添加到“ Academy One”的另一个教室中,我不会不想在它的单位数组中有重复项。

当我通过postman发布以下内容时,它给我错误:

{
"_id":"5d8ba151248ecb4df8803657", // user id
"unit":"Test", // another unit
"classroom":"5d8a709f44f55e4a785e2c50" // another classroom
}

回复:

  

{       “ status”:“ NOK”,       “ response”:“在路径\” unit \“”}的值\“ [{\” $ ne \“:[\” Academy One \“]}] \”“对[string]的广播失败

我想念什么?

2 个答案:

答案 0 :(得分:1)

实际上,我不需要$ne运算符,只需要直接使用$addToSet

user.updateOne({
  $addToSet: { unit: req.body.unit, classroom: req.body.classroom }
}).exec((err: Error) => {

谢谢!

答案 1 :(得分:0)

您需要使用$nin代替$nehttps://docs.mongodb.com/manual/reference/operator/query/nin/

unit: {$nin: [user.unit]}