Оператор $ addtoset не работает должным образом - PullRequest
0 голосов
/ 24 октября 2018

Я работаю со следующей схемой и использую pymongo для разработки.Я пытаюсь использовать $ addtoSet, чтобы добавить новый JSON в массив продуктов, чтобы избежать дубликатов.Я не могу найти подходящую статью, объясняющую этот вариант использования.Чтобы быть точным, как нужно использовать $ addtoset для массива json в качестве вложенного документа?

{
"_id": 1,
"product_prefix": "vendor",
"inventory": {
    "_id": 1,
    "products": [
        {
            "product_id": "vendor2",
            "item_name": "itemname2",
            "item_description": "item_description2",
            "price": 200,
            "available_units": 230,
            "available": 1
        },
        {
            "product_id": "vendor3",
            "item_name": "item 01",
            "item_description": "test item",
            "price": 200,
            "available_units": 1,
            "available": 1
        },
        {
            "product_id": "vendor4",
            "item_name": "item 01",
            "item_description": "test item",
            "price": 200,
            "available_units": 1,
            "available": 1
        },
        {
            "product_id": "vendor8",
            "item_name": "item 01",
            "item_description": "test item",
            "price": 200,
            "available_units": 1,
            "available": 1
        }
    ]
}

}

Вызов обновления, который упоминается ниже, фактически добавляет еще одну строку json

c.update_one(
    {'_id' : 1},
     {'$addToSet' : {"inventory.products" : {'product_id': 'vendor8', 'item_name': 'item 01', 'item_description': '
     test item', 'price': 5500, 'available_units': 1, 'available': 1} } })

после выполнения этой команды следующий результат в базе данных, хотя поле product_id в вложенном документе является уникальным ключом, которое все равно добавляет данные в вложенный документ.

{
                "product_id": "vendor8",
                "item_name": "item 01",
                "item_description": "test item",
                "price": 200,
                "available_units": 1,
                "available": 1
            },
            {
                "product_id": "vendor8",
                "item_name": "item 01",
                "item_description": "test item",
                "price": 5500,
                "available_units": 1,
                "available": 1
            }

Поскольку недавно добавленная строка уже существует, в этом случае $ addtoSet работает как положено.Способ, которым я пытаюсь использовать $ addToSet, неверен?Каков идеальный способ обновления массива json во встроенных документах в этом случае?

Немного объяснений также будет очень полезно ......

...