Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Node.js 值不在数组中时Mongoose findOneAndUpdate_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 值不在数组中时Mongoose findOneAndUpdate

Node.js 值不在数组中时Mongoose findOneAndUpdate,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有下面的Mongoose函数,我试图在其中选择电子邮件=请求正文。电子邮件和引用ID不在数组中 referenceId是一个字符串数组[string],它有一个对象ID数组 const refereeSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: {

我有下面的Mongoose函数,我试图在其中选择
电子邮件
=
请求正文。电子邮件
引用ID
不在数组中

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是否已经在数组中,然后不做任何其他操作来推送它。

考虑在
$ne
的补码中使用运算符<在这种情况下,数组本身的code>$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
$push将只在数组中推送数据,您应该使用$addToSet

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

更重要的是,您可以使用
$elemMatch
$nin
作为查找查询,这样,如果id位于referenceId中,文档本身就不会返回

$elemMatch:

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

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