Я довольно новичок в mongodb, так что вот мой вопрос: я хочу проверить, существует ли основной документ, а затем, если он есть, проверить, существует ли вложенный документ, обновить его и не вставлять новый , Но с помощью этого кода я могу только обновить существующий вложенный документ, но не могу создать новый. Я даже не знаю, правильно ли это использовать этот метод, это эффективно?
collection.find_one_and_update(
{"_id:{"field1":val1,"field2":val2,"field3":val3,"field4":val4}},
{"$set":{"elements.$[element].prop2":valToUpdate}},
return_document=ReturnDocument.AFTER,
array_filters=[{"element.prop1":valToCheck}],
upsert=True
)
В синтаксисе mon go я думаю, что-то вроде этого:
db.collection.findOneAndUpdate(
{"_id:{"field1":val1,"field2":val2,"field3":val3,"field4":val4}},
{"$set":{"elements.$[element].prop2":valToUpdate}},
{ arrayFilters: [ {"element.prop1":valToCheck} ] }
)
Могу ли я использовать одну такую функцию для выполнения всего процесса (проверьте, является ли основной и вложенный документ существует, и если он обновляется, в противном случае создайте новый)?
Пример того, как я хочу изменить документ:
перед выполнением метода
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"34"}}
]
}
После выполнения, если есть вложенный документ
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"55"}},
]
}
После выполнения, если нет вложенного документа
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"34"}},
{"name":"someOTHERbook","price":{"$numberDouble":"45"}}
]
}