исключить поля запроса поиска при вставке документа с использованием upsert: true - PullRequest
0 голосов
/ 25 мая 2018
db.getCollection('placeFollow').update(
{
    "_id":ObjectId("5af19959204438676c0d5268"),
    "count":{"$lt":2}
 },
 {   
     "$set":{"data":"check"}
  },
  {"upsert":true})

Ошибка: коллекция ошибок дублированного ключа E11000: индекс geoFame.placeFollow: ключ идентификатора дубликата: {: ObjectId ('5af19959204438676c0d5268')}

Индексы

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "geoFame.placeFollow"
    }
]

Я хочу сохранить документ, если он не существует.Но вышеупомянутый запрос пытается вставить _id, который указан в поисковом запросе, и выдает ошибку дублирующего ключа.Как исключить запрос поиска при вставке документа?

1 Ответ

0 голосов
/ 25 мая 2018

Основная проблема, конечно, заключается в предоставлении _id, но вам также необходимо установить поле "count".Использование $setOnInsert, вероятно, то, что вам нужно:

db.getCollection('placeFollow').update(
  { "count":{"$lt":2} },
  {   
     "$set":{ "data": "check" },
     "$setOnInsert": { "count": 2 }
  },
  {"upsert":true}
)

Так что вам нужно сделать что-то подобное с любыми данными «по умолчанию» или другими ожидаемыми данными.В противном случае MongoDB не найдет документ, потому что поле не существует, и попытается вставить с тем же значением _id, как указано.

Поскольку ваш код в настоящее время неверен, вам нужно удалить документ, который был создан без "count" first:

db.getCollection('placeFollow').deleteOne(
  { "_id":ObjectId("5af19959204438676c0d5268") }
)

Либо так, либо установите все документы со значением по умолчанию `count.

Но в принципе вы не можете использовать и" первичный ключ ", и другое условие при использовании"upsert ", потому что если документ не удовлетворяет условию, тогда предпринимается попытка upsert, и, конечно, существующее значение для _id является уникальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...