Я работаю со следующей схемой и использую 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 во встроенных документах в этом случае?
Немного объяснений также будет очень полезно ......