Mongoose findOneAndUpdate 当值不在数组中时

ngD*_*ugh 3 mongoose mongodb node.js

我有下面的 Mongoose 函数,我试图在其中选择 WHERE email=req.body.email并且referenceId 不在数组中。

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);
  });
Run Code Online (Sandbox Code Playgroud)

每次我运行上面的代码时,它总是匹配并推送 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 }
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

我想要做一个检查,看看是否该ObjectId存在已经在数组中,然后别的什么也不做推。

the*_*gar 5

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

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

更多细节

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);
 });
Run Code Online (Sandbox Code Playgroud)

更重要的是,您可以使用$elemMatch$nin作为查找查询,因此如果idreferenceId 中,则文档本身不会返回

$elemMatch :

referenceId: {
  '$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
}
Run Code Online (Sandbox Code Playgroud)

$nin:

referenceId: {
   '$nin': [new mongo.ObjectID(req.params.referenceId)]
}
Run Code Online (Sandbox Code Playgroud)