当值不在数组中时,使用猫鼬findOneAndUpdate

时间:2018-12-24 19:23:22

标签: node.js mongodb mongoose

我具有以下Mongoose函数,正在尝试 email = req.body.emailreferenceId进行选择的情况下不是在一个数组中。

referenceId是一个字符串数组[String],其中包含对象ID的数组。

const refereeSchema = new Schema({
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  referenceId: [
    {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    }
  ],
  token: {
    type: String,
    required: true
  },
  password: {
    type: String
  },
  company: {
    type: String,
    required: true
  },
  role: {
    type: String,
    required: false
  },
  startedOn: Date,
  endedOn: Date,
  createdAt: Date,
  updatedAt: Date
});


  Referee.findOneAndUpdate({
    email: req.body.email,
    referenceId: {
      '$ne': [new mongo.ObjectID(req.params.referenceId)]
    }
  }, {
    $push: {
      referenceId: new mongo.ObjectID(req.body.referenceId)
    }
  }, {
    new: true
  }, (err, doc) => {
    if (err) {
      res.status(401).send(err);
    }
    res.send(doc);
  });

每次运行上面的代码时,即使它已经存在,它总是匹配并推送ObjectId。

{ referenceId:
   [ 5ba94232b492890982e7a417,
     5ba94232b492890982e7a417,
     5c20d8f907a55accd720c27f,
     5c20d8f907a55accd720c27f,
     5c20d8f907a55accd720c27f,
     5c20d8f907a55accd720c27f,
     5c20d8f907a55accd720c27f,
     5c20d8f907a55accd720c27f ],
  _id: 5c20e86d72d5c1ce20b961fa,
  firstName: 'Richard',
  lastName: 'Hendricks',
  email: 'hello@domain.com',
  token: '319d9f5a-68e1-6f47-a9f1-7fbbf617a45c',
  company: 'Pied Piper',
  role: '',
  __v: 0 }

有人可以帮我吗?

我想检查一下如果 ObjectId已在数组中,则不要进行其他操作。

2 个答案:

答案 0 :(得分:2)

$ push 只会将数据推送到数组中,您应该使用 $ addToSet

$ addToSet 仅确保没有重复项添加到集合中,并且不影响现有重复项。 $ addToSet不保证修改后的集合中的元素具有特定顺序

more details

Referee.findOneAndUpdate({
    email: req.body.email,
    referenceId: {
       '$ne': [new mongo.ObjectID(req.params.referenceId)]
    }
   }, {
     $addToSet: {
        referenceId: new mongo.ObjectID(req.body.referenceId)
     }
   }, {
     new: true
   }, (err, doc) => {
     if (err) {
        res.status(401).send(err);
     }
     res.send(doc);
 });

您可以使用$elemMatch$nin作为查找查询,因此,如果 id 位于 referenceId < / p>

$ elemMatch:

referenceId: {
  '$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
}

$ nin:

referenceId: {
   '$nin': [new mongo.ObjectID(req.params.referenceId)]
}

答案 1 :(得分:1)

请考虑使用$elemMatch运算符补充$ne。在这种情况下,针对数组本身的$ne将始终返回true,因为在参数中传递的数组永远不会等于文档中的数组。

我还没有测试过,但是类似的方法应该起作用:

Referee.findOneAndUpdate({
    email: req.body.email,
    referenceId: {
      '$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
    }
  }, {
    $push: {
      referenceId: new mongo.ObjectID(req.body.referenceId)
    }
  }, {
    new: true
  }, (err, doc) => {
    if (err) {
      res.status(401).send(err);
    }
    res.send(doc);
  });

此外,您可能已经知道这一点,但是实际上可能要导入的两个 ObjectId类,您想要的是mongoose.Types.ObjectId