Pymongo Не вставляется полный документ при update_one

У меня есть много документов, которые нужно обновить, и я хочу сначала записать временную метку, а затем временную метку обновления, когда есть дубликаты. Поэтому я нашел этот ответ и пытаюсь применить его для MongoDB 6.0 https://stackoverflow.com/a/17533368/3300927

Я также сохраняю в своей модели переменную для использования при поиске дубликатов как searchable

Если запрос не имеет возможности поиска, то я вставляю его без проверки и добавляю метку времени, затем беру результаты и добавляю метку времени:

                data_inserted = collection.insert_many(results)
                for doc_id in data_inserted.inserted_ids:
                    collection.update_many(
                        filter={'_id': doc_id},
                        update={'$set': {'insert_date': now, }, },
                        upsert=True)

Там нет проблем:

{
  "_id": {
    "$oid": "321654987654"
  },
  "IR NUMBER": "ABC784",
  "Plate": " ",
  "Plate State": " ",
  "Make": "TOYOTA",
  "Model": "TACOMA",
  "Style": "  ",
  "Color": "SIL /    ",
  "Year": "2008",
  "insert_date": {
    "$date": {
      "$numberLong": "1660000808176"
    }
  }
}

Если есть searchable, я пытаюсь искать его. То, что я получаю в MongoDB, это только поле для поиска с меткой времени:

# q_statement.searchable == 'IR NUMBER'

                 for document in results:
                    collection.update_one(
                        filter={q_statement.searchable: document[q_statement.searchable], },
                        update={'$setOnInsert': {'insert_date': now, }, '$set': {'update_date': now, }},
                        upsert=True)

результат:

{
  "_id": {
    "$oid": "62f19d981aa321654987"
  },
  "IR NUMBER": "ABC784",
  "insert_date": {
    "$date": {
      "$numberLong": "1660001688126"
    }
  }
}

(python==3.10.3, Django==4.0.4, pymongo==4.2.0)

Для "upsert" полного документа и дополнительных полей с помощью python, вы можете использовать "$setOnInsert" MongoDB с python объединенным словарем.

Из документации библиотеки python вот как объединять словари. (Это похоже на "$mergeObjects" в MongoDB.)

d | other

Create a new dictionary with the merged keys and values of d and other,
which must both be dictionaries. The values of other take priority
when d and other share keys.

Итак, чтобы вставить полный document, используя ваш код python, нужно лишь небольшое дополнение - объединить document с вашим другим объектом.

...
update={'$setOnInsert': document | {'insert_date': now}, '$set': {'update_date': now, }}
...
Вернуться на верх