Нужна эквивалентная команда Pymongo для команды ручной работы в приглашении MongoDB с использованием фильтров массива.

Нужна эквивалентная команда Pymongo (Python Flask) для команды ручной работы:

db.UserInfoCollection.update({ "id" : "6efb83dc365fb6bdb3b78a9a"},
                             {$set: {'testArrayLevel1.$[i].testArrayLevel2.$[j].status':"registered"}},
                             {arrayFilters:[{"i.user_name":"test_user1"}, {"j.user_type": "basic"}]})

Приведенная выше команда обновила базу данных в ручном режиме Mongodb без каких-либо проблем.

Пробовал следующее (и update, и update_one, и arrayFilters, и array_filters):

mongo.db.UserInfoCollection.update_one({'id': id}, {"$set": {'testArrayLevel1.$[i].testArrayLevel2.$[j].status':"registered"}},{"array_filters":[{"i.user_name":user_name}, {"j.user_type": user_type}]}, upsert=False)

Эта команда выдает ошибку при выполнении в коде Python Flask:

**TypeError: update_one() got multiple values for argument 'upsert'**
mongo.db.UserInfoCollection.update_one({'id': id}, {"$set": {'testArrayLevel1.$[i].testArrayLevel2.$[j].status':"registered"}},{"array_filters":[{"i.user_name":user_name}, {"j.user_type": user_type}]})

Эта команда выдает ошибку при выполнении в коде Python Flask: TypeError: upsert must be True or False

Чего-то не хватает в моем формировании команды в Pymongo для рабочей команды. Здесь приветствуется любая помощь.


person Anand    schedule 10.07.2020    source источник


Ответы (1)


В pymongo вы должны передать array_filters как отдельный параметр; например

mongo.db.UserInfoCollection.update_one({'id': id},
                                       {"$set": {'testArrayLevel1.$[i].testArrayLevel2.$[j].status': "registered"}},
                                       array_filters=[{"i.user_name": user_name}, {"j.user_type": user_type}],
                                       upsert=False)

Ссылка: документация pymongo

person Belly Buster    schedule 10.07.2020