Ошибка mongodb $addToSet, укажите полный документ для вставки
Я провел небольшое исследование по этому вопросу и не обнаружил ничего такого, что сразу бросается в глаза, как то, что я ищу.
Скажем, у нас есть документ (или документы) в коллекции, который выглядит примерно так:
//First example document
{
"_id": "JK",
"letters": ["J", "K"]
}
//Second example document
{
"_id": "LM",
"letters": ["L"]
}
Поэтому я запускаю запрос, подобный приведенному ниже, чтобы проверить, есть ли у меня какие-либо подходящие документы, и, конечно же, я этого не делаю, поэтому я ожидаю получить нулевое значение.
> db.example.findOne({"_id": "LM", "letters": {"$in": ["M"]}})
null
Поэтому я делаю обновление и добавляю "M" в массив букв на документах (синтаксис может быть не совсем правильным):
> db.example.update({"_id": "LM"}, {"$addToSet": {"letters": "M"}})
Я запускаю возможность отсутствия совпадающего _id, поэтому findOne также возвращает null, учитывая примеры документов в коллекции для этого запроса.
> db.example.findOne({"_id": "AB", "letters": {"$in": ["A"]}})
null
Основываясь на том, как я построил вышеупомянутый запрос, я получаю нулевое значение, когда "A" не найден в письмах или _id "AB" не найдено ни в одном документе. В этом случае я знаю, что этого документа нет, потому что я знаю, что находится в коллекции.
Что я хотел бы сделать, так это сохранить мой запрос на обновление сверху с помощью $addToSet и изменить его, чтобы использовать upsert WHILE ТАКЖЕ, указав документ для вставки в случае сбоя $addToSet из-за того, что документ не существует для сокращения транзакций базы данных. Это возможно? Или мне придется немного разбить мои запросы, чтобы приспособиться к этому?
Потому что эта информация может повлиять на ответы: я делаю запросы через mongo shell и pymongo.
версия монго: 2.6.11
версия пимонго: 2.8
Спасибо за любую помощь!
РЕДАКТИРОВАТЬ: Таким образом, после перерыва и немного больше копать, кажется, setOnInsert делает то, что я искал. Я верю, что это, вероятно, решает мою проблему, но у меня еще не было возможности проверить.