草庐IT

node.js - 当值不在数组中时 Mongoose findOneAndUpdate

coder 2023-11-02 原文

我有下面的 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);
  });

每次我运行上面的代码时,它总是匹配并推送 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 已经在数组中,那么就不要再推送它了。

最佳答案

$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 在 < strong="">referenceId

$elemMatch :

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

$宁:

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

关于node.js - 当值不在数组中时 Mongoose findOneAndUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53917062/

有关node.js - 当值不在数组中时 Mongoose findOneAndUpdate的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  8. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  9. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐