【发布时间】:2019-07-02 21:53:48
【问题描述】:
我有一个包含 2 个数组的文档,我正在尝试使用 $elemMatch 同时根据某些条件更新两个数组的特定数组元素。
查询
targetManagementSchema.findOneAndUpdate({
franchiseeId : franchiseeId,
'yearlyTarget.year': 2019,
'quarterlyTarget': {
$elemMatch: {
'quarter.from': 7,
'quarter.to': 9
}
},
'monthlyTarget': {
$elemMatch: {
'month': 7
}
}
}, {
$set: {
'yearlyTarget.targetAchieved': 101540.7,
'quarterlyTarget.$.targetAchieved': 101540.7,
'monthlyTarget.$.targetAchieved': 101540.7
}
}, (err, updatedTargetRes) => {
if (err) {
console.log("error in updating targetsAchieved " + err);
} else if (updatedTargetRes != null && updatedTargetRes != '') {
console.log(updatedTargetRes + " :updatedTargetRes");
} else {
console.log("target not updated");
}
})
更新前的文档
{
"_id": ObjectId("5cc6d6151b74b719acd36eaf"),
"quarterlyTarget": [
{
"quarter": {
"from": 4,
"to": 6
},
"target": 47000,
"targetAchieved": 0
},
{
"quarter": {
"from": 7,
"to": 9
},
"target": 51200,
"targetAchieved": 0
},
{
"quarter": {
"from": 10,
"to": 12
},
"target": 64000,
"targetAchieved": 0
},
{
"quarter": {
"from": 1,
"to": 3
},
"target": 35000,
"targetAchieved": 0
}
],
"monthlyTarget": [
{
"month": 1,
"target": 10000,
"targetAchieved": 0
},
{
"month": 2,
"target": 10000,
"targetAchieved": 0
},
{
"month": 3,
"target": 15000,
"targetAchieved": 0
},
{
"month": 4,
"target": 15500,
"targetAchieved": 0
},
{
"month": 5,
"target": 15500,
"targetAchieved": 0
},
{
"month": 6,
"target": 16000,
"targetAchieved": 0
},
{
"month": 7,
"target": 16200,
"targetAchieved": 0
},
{
"month": 8,
"target": 17000,
"targetAchieved": 0
},
{
"month": 9,
"target": 18000,
"targetAchieved": 0
},
{
"month": 10,
"target": 19000,
"targetAchieved": 0
},
{
"month": 11,
"target": 20000,
"targetAchieved": 0
},
{
"month": 12,
"target": 19000,
"targetAchieved": 0
}
],
"franchiseeId": "5c42bd6085edaa215cba5a21",
"yearlyTarget": {
"year": 2019,
"target": 197200,
"targetAchieved": 0
},
"offer": null,
"status": "1",
"createdAt": ISODate("2019-04-29T10:46:45.643Z"),
"__v": 0
}
更新后的文档
{
"_id": ObjectId("5cc6d6151b74b719acd36eaf"),
"quarterlyTarget": [
{
"quarter": {
"from": 4,
"to": 6
},
"target": 47000,
"targetAchieved": 0
},
{
"quarter": {
"from": 7,
"to": 9
},
"target": 51200,
"targetAchieved": 101540.7 //updates successfully
},
{
"quarter": {
"from": 10,
"to": 12
},
"target": 64000,
"targetAchieved": 0
},
{
"quarter": {
"from": 1,
"to": 3
},
"target": 35000,
"targetAchieved": 0
}
],
"monthlyTarget": [
{
"month": 1,
"target": 10000,
"targetAchieved": 0
},
{
"month": 2,
"target": 10000,
"targetAchieved": 101540.7 //updates here, which is wrong
},
{
"month": 3,
"target": 15000,
"targetAchieved": 0
},
{
"month": 4,
"target": 15500,
"targetAchieved": 0
},
{
"month": 5,
"target": 15500,
"targetAchieved": 0
},
{
"month": 6,
"target": 16000,
"targetAchieved": 0
},
{
"month": 7,
"target": 16200,
"targetAchieved": 0 //must update the value 101540.7 here
},
{
"month": 8,
"target": 17000,
"targetAchieved": 0
},
{
"month": 9,
"target": 18000,
"targetAchieved": 0
},
{
"month": 10,
"target": 19000,
"targetAchieved": 0
},
{
"month": 11,
"target": 20000,
"targetAchieved": 0
},
{
"month": 12,
"target": 19000,
"targetAchieved": 0
}
],
"franchiseeId": "5c42bd6085edaa215cba5a21",
"yearlyTarget": {
"year": 2019,
"target": 197200,
"targetAchieved": 101540.7
},
"offer": null,
"status": "1",
"createdAt": ISODate("2019-04-29T10:46:45.643Z"),
"__v": 0
}
它采用第一个匹配项的索引,即 quarterlyTarget 数组的 1 并将其应用于 monthlyTarget 数组,而不是根据我指定的条件获取索引。因此更新了 monthlyTarget 数组的错误索引。
我知道这可以使用arrayFilters 来实现,我也做到了。但是我使用的mongodb版本是3.2,很遗憾无法升级,所以需要使用3.2支持的方法。
【问题讨论】:
标签: arrays node.js mongodb updates