¿Puedes especificar una clave para $addToSet en Mongo?
Tengo un documento:
{ 'profile_set' :
[
{ 'name' : 'nick', 'options' : 0 },
{ 'name' : 'joe', 'options' : 2 },
{ 'name' : 'burt', 'options' : 1 }
]
}
y me gustaría agregar un nuevo documento al profile_set
conjunto si el nombre aún no existe (independientemente de la opción).
Entonces, en este ejemplo, si intentara agregar:
{'name' : 'matt', 'options' : 0}
debería agregarlo, pero agregando
{'name' : 'nick', 'options' : 2}
No debería hacer nada porque ya existe un documento con nombre nick
aunque option
sea diferente.
Mongo parece coincidir con todo el elemento y termino comprobando si es el mismo y termino con
profile_set containing [{'name' : 'nick', 'options' : 0}, {'name' : 'nick', 'options' : 2}]
¿Hay alguna manera de hacer esto $addToSet
o tengo que presionar otro comando?
Puede calificar su update
con un objeto de consulta que impida la actualización si name
ya está presente en profile_set
. En el caparazón:
db.coll.update(
{_id: id, 'profile_set.name': {$ne: 'nick'}},
{$push: {profile_set: {'name': 'nick', 'options': 2}}})
Por lo tanto, esto solo se realizará $push
para un documento que coincida _id
y donde no haya un profile_set
elemento donde name
esté 'nick'
.
A partir de MongoDB 4.2 hay una manera de hacer esto usando expresiones de agregación en update .
Para su caso de ejemplo, haría esto:
newSubDocs = [ {'name' : 'matt', 'options' : 0}, {'name' : 'nick', 'options' : 2} ];
db.coll.update( { _id:1 },
[
{$set: { profile_set: {$concatArrays: [
"$profile_set",
{$filter: {
input:newSubDocs,
cond: {$not: {$in: [ "$$this.name", "$profile_set.name" ]}}
}}
]}}}
])