【问题标题】:Mongoose findOneAndUpdate when value is not in array当值不在数组中时,猫鼬 findOneAndUpdate
【发布时间】:2019-05-23 19:57:04
【问题描述】:

我有下面的 Mongoose 函数,我正在尝试在数组中选择 WHERE 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 已经在数组中,那么什么都不做。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    $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 作为查找查询,这样如果idreferenceId

    中,则文档本身不会返回

    $elemMatch:

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

    $nin:

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

    【讨论】:

      【解决方案2】:

      考虑使用$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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 2013-02-13
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2021-09-25
        • 2017-10-05
        • 1970-01-01
        相关资源
        最近更新 更多