推送/更新 BsonDocument 中的嵌入对象

问题描述 投票:0回答:1

在下面的数据集中,我想找到“pId=123”和“gmData.CarData.cars.oid='car_1'”,如果找到则更新“gmData.CarData.cars.dt”新值,否则将文档推送到“gmData.CarData.cars”中。

{
    "_id" : ObjectId("65a52a03ed163a5b8a06a80d"),
    "pId" : 123,
    "fv" : "1.2.3",
    "gmData" : {
        "CarData" : {
            "cars" : [
                {
                    "oid" : "car_1",
                    "dt" : {
                        "id" : "car_1",
                        "age" : 123,
                        "add" : "add_1"
                    }
                },
                {
                    "oid" : "car_2",
                    "dt" : {
                        "id" : "car_2",
                        "age" : 234,
                        "add" : "add_2"
                    }
                },
                {
                    "oid" : "car_3",
                    "dt" : {
                        "id" : "car_3",
                        "age" : 345,
                        "add" : "add_3"
                    }
                }
            ]
        }
    }
}

到目前为止已尝试使用

db.test.updateOne(
    { $and: [{pId:123}, {"gmData.CarData.cars.oid":"car_1"}],},
    {
        "$set":{"gmData.CarData.cars.$[curr].dt":{"id":"car_11","age":1123,"add":"add_11"}}
    },
    {
        arrayFilters: [ { "curr.oid": { $eq: "car_1" } } ]
    }
    )

如果“gmData.CarData.cars.oid.car_1”存在,则上述查询有效。但我想在“

gmData.CarData.cars
”中执行Push对象.dt":{ "id" : "car_11","age" : 1123,"add" : "add_11"}},如果不存在的话。

mongodb mongodb-.net-driver
1个回答
0
投票

我已经在没有

arrayFilters
的情况下找到了答案。

这是我所拥有的:

db.collection.update({
  "pId": 123
},
[
  {
    "$set": {
      "gmData.CarData.cars": {
        "$cond": {
          if: {
            $in: [
              "car_1",
              {
                "$ifNull": [
                  "$gmData.CarData.cars.oid",
                  []
                ]
              }
            ]
          },
          then: {
            $map: {
              input: "$gmData.CarData.cars",
              in: {
                $cond: {
                  if: {
                    $eq: [
                      "$$this.oid",
                      "car_1"
                    ]
                  },
                  then: {
                    $mergeObjects: [
                      "$$this",
                      {
                        "dt": {
                          "id": "car_11",
                          "age": 1123,
                          "add": "add_11"
                        }
                      }
                    ]
                  },
                  else: "$$this"
                }
              }
            }
          },
          else: {
            "$concatArrays": [
              [
                {
                  "oid": "car_1",
                  "dt": {
                    "id": "car_11",
                    "age": 1123,
                    "add": "add_11"
                  }
                }
              ],
              {
                $ifNull: [
                  "$gmData.CarData.cars",
                  []
                ]
              }
            ]
          }
        }
      }
    }
  }
],
{
  "upsert": true
})

它将查找带有

pId == 123
的文档并更新或创建
oid == 'car_1'
所在的汽车。

您可以在 mongoplayground 上亲自尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.