Как правильно отстаивать с помощью ReactiveMongo

Предположим, у меня есть эта запись в коллекции:

{
    "_id" : ObjectId("5c56160e4b6929067972b4c8"),
    "name" : "car",
    "attributes" : [
        {
            "color" : "blue",
            "qty" : 10
        }
    ]
}

Код, который я реализовал для выполнения upsert, выглядит следующим образом:

  def insert(item: Item): Future[Option[Item]] = {
    val selector = BSONDocument("name" -> item.name, "attributes" -> BSONDocument("$elemMatch" -> Json.toJson(item.attributes.head)))

    val updateModifier = BSONDocument(
      f"$$push" -> BSONDocument("attributes" -> Json.toJson(item.attributes.head)))

    itemsCollection.flatMap(
      _.findAndUpdate(selector, updateModifier, upsert = true)
        .map(_.result[Item])
    )
  }

Однако при выполнении этого кода коллекция обновляется следующим образом:

{
    "_id" : ObjectId("5c56160e4b6929067972b4c8"),
    "name" : "car",
    "attributes" : [
        {
            "color" : "blue",
            "qty" : 10
        },
        {
            "color" : "blue",
            "qty" : 10
        }
    ]
}

Обратите внимание, что добавлена ​​повторяющаяся запись. Это не должно происходить в соответствии с настойчивой логикой.

Как я могу предотвратить вставку дубликата? Что не так с кодом?

0 ответов

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