在下面的数据集中,我想找到“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"}}
,如果不存在的话。
我已经在没有
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'
所在的汽车。