gpt4 book ai didi

arrays - 如何根据特定条件更新文档中的 2 个数组元素

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:38 25 4
gpt4 key购买 nike

我有一个由 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支持的方法。

最佳答案

viewmultiplrarrayupdate: (callback) => {
maultipleArrayUpdate.findOneAndUpdate({
"franchiseeId": '5c42bd6085edaa215cba5a21',
'yearlyTarget.year': 2019,
'quarterlyTarget': {
$elemMatch: {
'quarter.from': 7,
'quarter.to': 9
}
}
},
{
$set: {
'yearlyTarget.targetAchieved': 101540.7,
'quarterlyTarget.$.targetAchieved': 101540.7,
}
}
, (err, updatedTargetResponse) => {
if (err) {
callback(err, null)
}
else {
maultipleArrayUpdate.findOneAndUpdate({
"franchiseeId": '5c42bd6085edaa215cba5a21',
'yearlyTarget.year': 2019,
'monthlyTarget': {
$elemMatch: {
'month': 7
}
}
}, { 'monthlyTarget.$.targetAchieved': 101540.7 }, (error, updatedTargetRes) => {
if (error) {
callback(error, null)
}
else {
callback(null, "successfully updated")
}
})
}
})
},

关于arrays - 如何根据特定条件更新文档中的 2 个数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com