Как правильно отстаивать с помощью 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
}
]
}
Обратите внимание, что добавлена повторяющаяся запись. Это не должно происходить в соответствии с настойчивой логикой.
Как я могу предотвратить вставку дубликата? Что не так с кодом?