1 Mongodb Actualizar varios objetos de matriz a la vez [duplicado]

pregunta creada en Sun, Mar 17, 2019 12:00 AM
    

Esta pregunta ya tiene una respuesta aquí:

    

Estoy tratando de ingresar cada family Documentos, y en cada uno de esos documentos, Verifique si hay un user en el users array (usuario es un object) que coincide con los resultados, y luego actualice uno específico.

¿Cómo lograría que la consulta se hiciera a través de los documentos, y en cada usuario, si los criterios coinciden, actualícelos?

Código de primer intento:

            var From_joinedTime = new Date().getTime() - (60*60*24*2*1000);

   return Family.updateMany({"users.permission" : 0, "users.joined_date" : {$lte: From_joinedTime}},{$set: {"users.$.permission" : 1}},{multi:true}).then(function (response) {
                    return response;
                });

Tenga en cuenta:

Intenté con Google y encontré el mismo problema, y ​​probé la respuesta de Neil Lunn : Cómo actualizar varios elementos de matriz en mongodb

Código modificado de Neil Lunn :

Family.update(
                { "users.permission":0, "users.joined_date":  {$lte: From_joinedTime}},
                { "$set": { "users.$[elem].permission": 1 } },
                { "arrayFilters": [{ "users.permission": 0,
                        "users.joined_date":  {$lte: From_joinedTime} }], "multi": true }
            )

Pero eso falló.

Encontré esta pregunta que tenía el mismo problema, pero no encontré la respuesta suficientemente buena: No se puede leer la propiedad 'castForQuery' de undefined at castArrayFilters en Node.js

error:

(node:9740) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'castForQuery' of undefined
at castArrayFilters (\node_modules\mongoose\lib\helpers\update\castArrayFilters.js:60:37)
at _castArrayFilters (\node_modules\mongoose\lib\query.js:1736:5)
at model.Query._updateThunk (\node_modules\mongoose\lib\query.js:3449:3)
at model.Query.<anonymous> (\node_modules\mongoose\lib\query.js:3535:23)
at model.Query._wrappedThunk [as _execUpdate] (\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8)
at process.nextTick (\node_modules\kareem\index.js:369:33)
at process._tickCallback (internal/process/next_tick.js:61:11)

¿Qué hago?

    
1
  1. Lee la respuesta y la documentación nuevamente. { "arrayFilters": [{ "elem.permission": 0, "elem.joined_date": {$lte: From_joinedTime} }]. Usó "$set": { "users.$[elem].permission": 1 } Eso significa que elem es el nombre del identificador y no users, ya que ese es el nombre de la matriz real. El identificador es lo que se espera y Mangosta emite el error cuando no puede analizar y coincidir con el identificador faltante en la declaración.
    2019-03-18 05: 32: 28Z
1 Respuestas                              1                         

Por favor, intente esta consulta: -

Family.update(
                { "users.permission":0, "users.joined_date":  {$lte: From_joinedTime}},
                { "$set": { "users.$.permission": 1 } },
                { "multi": true }
            )

El operador posicional $se encargará de actualizar el usuario coincidente dentro de la matriz.

    
0
2019-03-18 02: 19: 33Z
fuente colocada aquí