MongoDB:将元素添加到数组的内部数组中,其中一个对象包含对另一个字段进行计算的字段



我有一个文档:

{
"_id" : ObjectId("626c0440e1b4f9bb5568f542"),
"ap" : [ 
{
"ap_id" : ObjectId("000000000000000000000001"),
"shop_prices" : [ 
{
"shop_id" : ObjectId("000000000000000000000097"),
"price" : 102
}
]
}
],
"bc" : [ 
{
"bc_id" : ObjectId("000000000000000000000003"),
"price" : 102
}, 
{
"bc_id" : ObjectId("000000000000000000000004"),
"price" : 104
}
],
"stock_price" : 70
}

我的需要是最终添加到app .shop_prices元素,如果不存在这样的结构:

{
"shop_id" : ObjectId("000000000000000000000096"),
"price" : 104
}

,其中价格为bc。价格是bc。bc_id = ObjectId("000000000000000000000004")

这是我第一次(不成功)尝试:

updateMany(
{
"_id": {"$eq": ObjectId("626c0421e1b4f9bb5568f531")},
"ap":{
$elemMatch:{
"ap_id":{$in:[ObjectId("000000000000000000000001")]},
"shop_prices.shop_id":{$ne:ObjectId("000000000000000000000096")}
}
},
"bc.bc_id": ObjectId("000000000000000000000003")
},
[
{"$set": 
{"ap.$.shop_prices": 
{"$cond": 
[{"$in": [ObjectId("000000000000000000000096"), "$ap.$.shop_prices.shop_id"]}, "$ap.$.shop_prices",
{"$concatArrays": 
["$ap.$.shop_prices",
[{"shop_id": ObjectId("000000000000000000000096"), "price": ???}]
]
}
]
}
}
}
]
)

thanks in advance

你可以这样做:

  • 使用$project
  • 查找与您的请求相关的bc
  • 使用$map在$set操作符

这应该是解决方案:

db.getCollection('test').update({
"ap": {
$elemMatch: {
"ap_id":{$in:[ObjectId("000000000000000000000001")]},
"shop_prices.shop_id":{$ne:ObjectId("000000000000000000000096")}
}
},
"bc.bc_id": ObjectId("000000000000000000000004")
},
[
{
$project: {
ap: 1, 
bc: 1,
stock_price: 1,
current_bc: { 
$arrayElemAt: [ {
$filter: {
input: "$bc",
as: "curr_bc",
cond: {$eq: ["$$curr_bc.bc_id", ObjectId("000000000000000000000004")]}
}
}, 0 ] 
}
}
},
{
$set: {
"ap": {
"$map": {
input: "$ap",
as: "current_ap",
in: {
$cond: [
{$eq: [ObjectId("000000000000000000000001"), "$$current_ap.ap_id"]}, 
{  
"$mergeObjects": [
"$$current_ap",
{"shop_prices": {$concatArrays: ["$$current_ap.shop_prices", [{"shop_id": ObjectId("000000000000000000000096"), "price": "$current_bc.price"}]]}}
]
},
"$$current_ap"
]
}
}
}
}
}
])

最新更新