繁体   English   中英

在 mongoDB 的数组中更新嵌套的 Object

[英]update nested Object in Array in mongoDB

我被困在我想创建的查询中。 假设我在随机集合中有以下文档:

[
    {
        "name":"Max",
        "cars":[
            {
                "company":"Ford",
                "price":5000
            },
            {
                "company":"BMW",
                "price":7500
            }
        ]
    },
    {
        "name":"Josy",
        "cars":[
            {
                "company":"Ford",
                "price":3000
            },
            {
                "company":"BMW",
                "price":5500
            }
        ]
    }
]

在第一步中,我想将其他数据添加到我的 Array Cars 中,这对我来说很好:

db.user.updateMany(
    {}, 
    {$set:{"cars.$[].isPremium":false}}
)

但是现在我想将 isPremium 更新为 true 如果价格更高 3500

db.user.updateMany(
    {cars : {$elemMatch:{price:{$gt:3500}}} }, 
    {$set:{"cars.$[].isPremium":true}}
)

但这不起作用,因为价格为 3000 的乔西福特被设置为溢价,但价格不 > 3500。那么出了什么问题?

解决方案 #1:在使用false值初始化isPremium字段后尝试以下查询:

db.user.updateMany(
    {
        cars: { $elemMatch: { price: { $gt: 3500 } } }
    },
    {
        $set: {
            "cars.$[obj].isPremium": true
        }
    },
    {
        arrayFilters: [
            {
                "obj.price": { $gt: 3500 }
            }
        ]
    }
)

解决方案#2:不需要您的第一个更新查询(即,使用false初始化isPremium )。

db.user.updateMany(
  {
    cars: { $elemMatch: { price: { $gt: 3500 } } }
  },
  {
    $set: {
      "cars.$[premium].isPremium": true,
      "cars.$[nonPremium].isPremium": false
    }
  },
  {
    arrayFilters: [
      {
        "premium.price": { $gt: 3500 }
      },
      {
        "nonPremium.price": { $lte: 3500 }
      }
    ]
  }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM