У меня есть документ, который состоит из 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
}
Он принимает индекс первого совпадения, т. Е. 1
массива quarterlyTarget
, и применяет его к массиву monthlyTarget
вместо взятия индекса на основе указанного условия. Следовательно, обновление неверного индекса массива monthlyTarget
.
Я знаю, что этого можно достичь с помощью arrayFilters
, я тоже это сделал. Но версия mongodb, которую я использую, - 3.2, и, к сожалению, я не могу ее обновить, поэтому мне нужно работать с методом, поддерживаемым 3.2.