【问题标题】:Change a specific field in multiple object of a sub document mongoose更改子文档猫鼬的多个对象中的特定字段
【发布时间】:2021-07-13 02:54:16
【问题描述】:

我正在尝试将子文档的多个对象中的特定字段更改为 false,但是当我尝试使用 $set 更新文档时遇到了 mongoose 问题。

这是数据结构。

[{
    name: 'Joe',
    card: [
      { type: 'visa', select: true},
      { type: 'masterCard', select: false},
      { type: 'unionPay', select: true},
    ]
},{
    name: 'Pascal',
    card: [
      { type: 'unionPay', select: false},
      { type: 'visa', select: true},
      { type: 'masterCard', select: false},
    ]
}]

执行结果

[{
    name: 'Joe',
    card: [
      { type: 'visa', select: false}, <--- was changed to false
      { type: 'masterCard', select: false},
      { type: 'unionPay', select: false}, <--- was changed to false
    ]
},{
    name: 'Pascal',
    card: [
      { type: 'unionPay', select: false},
      { type: 'visa', select: true},
      { type: 'masterCard', select: false},
    ]
}]

我目前编写了这个查询,但它没有按预期工作。

 this.user.model().findOneAndUpdate(
 { name: 'Joe },
  {
    card:{$set: { select: false },
  },
 );

我做错了什么?

【问题讨论】:

    标签: mongodb mongoose mongodb-query mongoose-schema


    【解决方案1】:

    演示 - https://mongoplayground.net/p/-ScRx2XpZ9E

    使用$[]

    过滤的位置运算符 $[] 识别与更新操作的 arrayFilters 条件匹配的数组元素

    一次可以更新 1 个顶级索引

    db.collection.update(
     { name: "Joe" },
     { $set: { "card.$[c].select": false } },
     { arrayFilters: [ { "c.type": "visa" } ] }
    )
    

    使用db.collection.bulkWrite 1 次查询 2 个。

    db.collection.bulkWrite( [
       {
          updateOne : {
             "filter":{ name: "Joe" },
             "update": { $set: { "card.$[c].select": false } },
             "arrayFilters": [ { "c.type": "visa" } ]
          }
       },
       {
          updateOne : {
             "filter":{ name: "Joe" },
             "update": { $set: { "card.$[c].select": false } },
             "arrayFilters": [ { "c.type": "unionPay" } ]
          }
       }
    ])
    

    【讨论】:

    • 谢谢。我使用了``` db.collection.update({ name: "Joe" }, { $set: { "card.$[c].select": false } }, { arrayFilters: [ { "c.select": { "$ne": false } } ] }) ``` 无需大量编写即可工作
    • @HenryOkonkwo 真棒:)
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2017-04-26
    • 1970-01-01
    • 2020-12-02
    • 2020-07-25
    • 1970-01-01
    • 2022-11-28
    • 2017-02-10
    相关资源
    最近更新 更多