Как вставить документ с collection.update_many() в коллекцию (MongoDB) с помощью Pymongo (без дублирования)

#python #mongodb #pymongo

#python #mongodb #pymongo

Вопрос:

Я вставляю документ в коллекцию с помощью collection.update(), потому что у меня есть postID разные данные. Я хочу, чтобы при запуске, если сообщение было вставлено в MongoDB, сообщение было обновлено (не вставлять новое сообщение с postID перекрытием с postID первым). Это структура моих данных:

 comment1 = [
   {
     'commentParentId': parent_content.text,
     'parentId': parent_ID,
     'posted': child_time.text,
     'postID':child_ID,
     'author':
          {
           'name': child_name.text
          },
     'content': child_content.text
   },
   ...............
]
  

Это мой код, который я использовал для вставки данных :

 client = MongoClient()
db = client['comment_data2']
db.collection_data = db['comments']
for i in data_comment:
   db.collection_data.update_many(
        {db.collection_data.find({"postID": {"$in": i["postID"]}})},
        {"$set": i},
        {'upsert': True}
   )
  

Но у меня ошибка: TypeError: filter must be an instance of dict, bson.son.SON, or other type that inherits from collections.Mapping в строке {'upsert': True} . И {db.collection_data.find({"postID": {"$in": i["postID"]}})} правильно?

Ответ №1:

вы можете использовать этот код:

 db.collection_data.update_many(
    {"postId": i["postID"]},
    {"$set":i},
    upsert = True
)
  

Комментарии:

1. Ошибка: SyntaxError: invalid syntax который upsert = True

2. { «upsert»: True } может решить эту ошибку, потому что 3-й аргумент — это тип объекта.

3. Я попробовал ваше решение, но моя ошибка не решена (та же ошибка в сообщении)

4. db.collection_data.updateMany( {"postId": i["postID"]}, {"$set":i}, { upsert: True } )

5. я попробовал этот код и не получил ошибки. пожалуйста, пришлите мне ваш новый код.