Как обновить 2 элемента массива в документе на основе определенных условий - PullRequest
1 голос
/ 01 июля 2019

У меня есть документ, который состоит из 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.

Ответы [ 2 ]

1 голос
/ 02 июля 2019
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")
            }
          })
        }
      })
  },
0 голосов
/ 02 июля 2019

хорошо, вы пропустили {upsert:true}

Я запустил этот запрос в редакторе Mongo, и он заработал. Дайте мне знать, если это работает для вас (также знайте, что я использовал только пассивный запрос поиска, так как есть только один документ. Вы можете продолжить и использовать полный блок поиска. Я сосредоточился на обновлении документа)

db.user_test.findOneAndUpdate(

    {franchiseeId: "5c42bd6085edaa215cba5a21", "yearlyTarget.year":2019, "quarterlyTarget": {
        $elemMatch: {
            "quarter.from": 7,
            "quarter.to": 9
        }
      }},

      {
    $set: {
        'yearlyTarget.targetAchieved': 101540.7,
        'quarterlyTarget.$.targetAchieved': 101540.7,
        'monthlyTarget.$.targetAchieved': 101540.7
    }
}, 

{upsert:true})

это документ, который я получил после обновления

{
    "_id" : ObjectId("5d1a1212a9eea913c2b8229a"),
    "quarterlyTarget" : [
        {
            "quarter" : {
                "from" : 4,
                "to" : 6
            },
            "target" : 47000,
            "targetAchieved" : 0
        },
        {
            "quarter" : {
                "from" : 7,
                "to" : 9
            },
            "target" : 51200,
            "targetAchieved" : 101540.7
        },
        {
            "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
        },
        {
            "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" : 101540.7
    },
    "offer" : null,
    "status" : "1",
    "createdAt" : ISODate("2019-04-29T06:46:45.643-04:00"),
    "__v" : 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...