首页 > 解决方案 > 更新 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。那么出了什么问题?

标签: mongodb

解决方案


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

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

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

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 }
      }
    ]
  }
)

推荐阅读