updatemany update modify existing example array actualizar mongodb mongoose nosql

modify - update array mongodb



ActualizaciĆ³n de Mongodb con upsert y multi sintaxis (1)

No puede actualizar múltiples registros en función de diferentes criterios y esperar "restablecer" para entender lo que quiere decir. El indicador Upsert puede causar la inserción de como máximo un documento y si revisa la documentación verá que no tiene sentido tener un criterio "compuesto" para la actualización en caso de un upsert.

En su ejemplo, ¿cuál de los dos valores de fbid debería usar el inserto?

Creo que en su caso puede tomar varios enfoques (todos implican más de una operación). Puede actualizar utilizando el indicador de inserción en una actualización de llamada en bucle una vez por cada valor de búsqueda - esto funcionará como esperaba y si no se encuentra fbid, se creará un documento nuevo para él. Otras formas implican consultar antes de ejecutar la actualización, pero creo que esas formas pueden ser más propensas a las condiciones de carrera.

Aquí hay una explicación de cómo funciona la actualización: la encuentro bastante completa: http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

Soy nuevo en mongodb y estoy tan estresado debido a la documentación incompleta de mongodb, que me deja a prueba y error ... lamentablemente, todos mis intentos no funcionan sin ningún error, dejándome confundido sobre lo que estaba pasando y qué debugurar ...

Solo necesito actualizar varios registros en la base de datos que coincidan con ciertos criterios, y para los registros no existentes, crear nuevas entradas para eso. Creo que puedo hacerlo con un solo acceso a la base de datos con actualización, upsert y multi. Esto es lo que se me ocurrió:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );

También probé varias combinaciones o incluso la versión anterior, como:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );

ninguno de ellos funciona ...

Por favor, ayúdenme con estas cosas tan triviales ... Puedo hacerlo fácilmente en sql, pero la cosa de nosql es tan limitante para mí ... ¡Gracias!

EDITAR:

La misma consulta sobre el hallazgo funciona perfectamente:

dbschema.Person.find( { person_id: { $in: ["734533604" ,"701084015"] } }, function ( err, results ) { console.log( ''result: '' + results ); console.log( ''error: '' + err ); console.log( ''result length: '' + results.length ); } );

EDITAR:

Espero que se cree el registro "no encontrado" y que se actualice el registro encontrado. mi lógica puede ser defectuosa y estoy tan confundido ahora.

Originalmente, encontré () un registro a la vez, cambié el valor y llamé a save () para cada uno de los registros modificados, pero cuando implementé en vivo, el tiempo de respuesta se volvió cientos de veces más lento, especialmente cuando hay un unos cientos de registros para actualizar en cada solicitud.

Luego encontré find () + $ in, y el rendimiento se restableció e incluso mejor que el anterior (cuando consulta), pero la actualización sigue siendo inaceptablemente lenta. Por lo tanto, ahora estoy buscando formas de actualizar todos los documentos en una consulta. .

lo que normalmente hago en SQL es usar UPDATE WHEN CASE THEN ... ej .:

UPDATE person SET score = CASE WHEN person_id = "734533604" THEN 1200 WHEN person_id = "701084015" THEN 1200 ELSE score END