Как найти и обновить вложенный элемент массива в объекте на mongodb - PullRequest
0 голосов
/ 25 октября 2019

У меня есть коллекция внизу. Я пытаюсь обновить элемент массива.

Я пытаюсь обновить, если значение lineItem _id равно 1, затем перейдите в список спецификаций и обновите значение характеристики с 900 до 50, если для specName установлено значение «Модель», как вы можете видеть,_id также является массивом.

сбор данных:

    {
    "_id": "100",
    "name": "Campaign",
    "status": "Active",
    "parts": {
        "lineItem": [
            {
                "_id": [
                    {
                        "name": "A",
                        "value": "1"
                    }
                ],
                "spec": [
                    {
                        "specName": "Brand",
                        "characteristicsValue": [
                            {
                                "value": "500"
                            }
                        ]
                    },
                    {
                        "specName": "Model",
                        "characteristicsValue": [
                            {
                                "value": "900"
                            }
                        ]
                    }
                ]
            },
            {
                "_id": [
                    {
                        "name": "B",
                        "value": "2"
                    }
                ],
                "spec": [
                    {
                        "specName": "Brand",
                        "characteristicsValue": [
                            {
                                "value": "300"
                            }
                        ]
                    },
                    {
                        "specName": "Model",
                        "characteristicsValue": [
                            {
                                "value": "150"
                            }
                        ]
                    }
                ]
            },
            {
                "_id": [
                    {
                        "name": "C",
                        "value": "2"
                    }
                ]
            }
        ]
    }
}

связанное обновление не работает, как я ожидал.

 db.Collection.update({"parts.lineItem._id.value" : "1", 
    "parts.lineItem.spec.specName" : "Model"  },{ $set: { 
    "parts.lineItem.spec.$.characteristicsValue" : "50" } })

РЕДАКТИРОВАТЬ: Каждый _id имеет массив спецификаций. Итак, нам нужно найти _id, а затем перейти к спецификации в массиве _id, найти марку и обновить значение.

1 Ответ

1 голос
/ 25 октября 2019

Попробуйте так:

db.Collection.update(
   {},
{ $set: { "parts.lineItem.$[outer].spec.$[inner].characteristicsValue" : "50" } },
{ multi: true, arrayFilters: [{"outer._id.value" : "1"}, {"inner.specName" : "Model"}]}
);
...