我在mongodb中有一个文档,有两层深层嵌套的对象数组,我需要更新,就像这样。
{
"id":12362,
"onGoing":[
{
"id":14597,
"offers":[
{
"id":56897,
"status":"validated"
},
{
"id":86127,
"status":"validated"
}
]
},
{
"id":89451,
"offers":[
{
"id":12235,
"status":"validated"
},
{
"id":56457,
"status":"validated"
}
]
}
]
}
我想更新与其ID匹配的所有优惠。
我尝试更新
db.repairJobs.update({
"onGoing.offers":{
$elemMatch:{
_id:{
$in:[
'56897', '56457'
]
}
}
}
},
{
$set:{
"ongoing.offers.$.status":"ACCEPTED"
}
});
但是得到错误:不能使用部分(正在进行的.offers.0.status)来遍历元素({ongoing:[{_id:null,...
有没有更新的方法,解决方案需要与spring Data兼容。
答案 0 :(得分:0)
据我所知,没有办法在MongoDB中更新两层深层次的文档。我偶然发现了这个JIRA项目。我不认为在更新操作中可以使用多个$
运算符。
https://jira.mongodb.org/browse/SERVER-831
我不知道任何基于您当前架构的变通方法,但我建议您说,将您的每个onGoing阵列拆分为不同的文档。
答案 1 :(得分:0)
JS方式:
db.repairJobs.find().forEach(function(doc){
//make changes on the JSON(BSON) object here.
db.repairJobs.save(doc);
}
);
示例:
db.repairJobs.find().forEach(function(doc){
var valueToCheck = ['56897', '56457']
for(var i =0; i< doc.ongoing.offers.length; i ++){
if(valueToCheck.indexOf(doc.ongoing.offers[i].id) > -1){
doc.ongoing.offers[i].status = "ACCEPTED"
}
}
db.repairJobs.save(doc);
}
);
答案 2 :(得分:0)
您可以使用数组过滤器执行此操作
Update Nested Arrays in Conjunction with $[]
关于您的问题,我的解决方法是
db.repairJobs.update(
{},
{
$set: {
"onGoing.$[].offers.$[elem].status": "ACCEPTED"
}
},
{
arrayFilters: [{ "elem.id": {$in: [56897, 56457]} }],
multi: true
});