sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualice el objeto anidado en MongoDB si existe; de ​​lo contrario, agréguelo

Para insertar un documento si no existe, se realiza upsert y si desea actualizar un documento incrustado condicional, necesita el operador posicional $. Por lo tanto, debe usar ambos en la consulta para implementar la funcionalidad anterior.

Pero en este momento mongodb no admite upserting con el operador posicional $

Entonces, lo que desea no es posible hacerlo en una consulta por ahora, alternativamente puede hacerlo en dos consultas.

Primero

db.collection('ratings').update(
  {"refid":refid, "votes.ip": ip},
  {
     $set: { "votes.$.rating":rating }
  }
)

Devuelve el número de documentos actualizados, si es 1, está bien, y si es 0, debe enviar un nuevo registro.

db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
    {$push: { votes: { "ip":ip , "rating":rating  }}
})

También hay un ticket de Jira para el operador posicional y la modificación, por favor vote por este problema si desea esta funcionalidad en mongodb. A continuación se muestra el enlace del problema

https://jira.mongodb.org/browse/SERVER-3326

(EDITAR :El ticket de Jira se cerró con Won't Do en junio de 2019)