Ошибка 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 делает то, что я искал. Я верю, что это, вероятно, решает мою проблему, но у меня еще не было возможности проверить.

0 ответов

Другие вопросы по тегам