Tengo un grupo de matriz de elementos en MongoDB como se indica a continuación:
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 3, "score" : 5 } ], "play" : [ { "wk" : 2, "score" : 8 }, { "wk" : 3, "score" : 5 } ] }Estoy tratando de insertar un nuevo registro en la matriz si no está presente y si el registro está presente en esa matriz, actualice ese registro de la matriz. A continuación se muestra mi consulta MongoDB.
db.push.update( { _id: 5 }, { $push: { "quizzes": {"wk" : 6.0,"score" : 8.0},"play": {"wk" : 6.0,"score" : 8.0} } } )Cada vez que ejecuto esta consulta, inserta un nuevo registro en la matriz, pero quiero que si el registro está presente, actualice esa matriz.
Use $addToSet en lugar de $push .
db.push.update( { _id: 5 }, { $addToSet: { "quizzes": {"wk": 6.0, "score": 8.0}, "play": {"wk": 6.0, "score": 8.0} } } )EDITAR:
No existe un enfoque integrado simple para la actualización condicional de subdocumentos en un campo de matriz, por propiedad específica. Sin embargo, un pequeño truco puede hacer el trabajo ejecutando dos comandos en secuencia.
Por ejemplo: si queremos actualizar el campo de quizzes con el objeto { "wk": 7.0, "score": 8.0 } , podemos hacerlo en dos pasos:
Paso 1: $pull subdocumentos de la matriz de quizzes donde "wk": 7.0 . ( No sucede nada si no se encuentra el subdocumento coincidente ).
db.push.update( { _id: 5 }, { $pull: { "quizzes": { "wk": 7.0 } } } ) Paso 2: $addToSet el subdocumento.
db.push.update( { _id: 5 }, { $addToSet: { "quizzes": {"wk": 7.0, "score": 8.0} } } ) Puede combinar los dos comandos de actualización anteriores usando bulk.find().update()
Supongo que lo que quiere hacer es agregar una propiedad a un elemento de la matriz en función del valor de la propiedad diferente del mismo elemento.
Puede usar la función updateOne() con el operador $(update) , consulte el documento documentación de mongodb para $(update) .
Supongamos que desea agregar una descripción de propiedad al elemento de matriz donde el valor de wk es 1 (suponiendo que sea algún tipo de clave según lo que ha proporcionado)
Entrada: Su recopilación de datos dada en la pregunta.
Comando Mongo:
db.<your_collection_name>.updateOne( { "_id":5, "quizzes.wk":1 }, { $set:{ "quizzes.$.description":"I am a new property" } });Producción:
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10, "description" : "I am a new property" }, { "wk" : 2, "score" : 8 }, { "wk" : 3, "score" : 5 } ], "play" : [ { "wk" : 2, "score" : 8 }, { "wk" : 3, "score" : 5 } ] }Nota: Solo cambiará una entrada de una matriz, la que coincida primero.