arrays mongodb mongodb-query aggregation-framework

arrays - $ in requiere una matriz como segundo argumento, encontrado: falta



mongodb mongodb-query (1)

¿Alguien por favor me puede decir qué estoy haciendo mal?

estructura del documento db:

{ "_id" : "module_settings", "moduleChildren" : [ { "_id" : "module_settings_general", "name" : "General", }, { "_id" : "module_settings_users", "name" : "Users", }, { "_id" : "module_settings_emails", "name" : "Emails", } ], “permissions” : [ "module_settings_general", "module_settings_emails" ] }

etapa de la tubería:

{ $project: { filteredChildren: { $filter: { input: "$moduleChildren", as: "moduleChild", cond: { $in : ["$$moduleChild._id", "$permissions"] } } }, }}

Necesito filtrar la matriz "moduleChildren" para mostrar solo los módulos cuyos identificadores están en la matriz de "permisos". He intentado "$$ ROOT.permissions" y "$$ CURRENT.permissions" pero ninguno de ellos está funcionando. Siempre me sale un error que a $ in le falta el array como argumento. Funciona cuando codifico la matriz de esta manera: cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] } por lo que parece que el problema está en pasar la matriz. Gracias por cualquier consejo!


Primera opción -> Usar agregación

Debido a que algunos de los documentos de su colección pueden o no contener el campo de permissions o el tipo no es igual a la matriz, es por eso que está recibiendo este error.

Puede encontrar el $type del campo y, si no es una matriz o no existe en su documento, puede agregarlo como una matriz con $addFields y $cond $addFields

db.collection.aggregate([ { "$addFields": { "permissions": { "$cond": { "if": { "$ne": [ { "$type": "$permissions" }, "array" ] }, "then": [], "else": "$permissions" } } }}, { "$project": { "filteredChildren": { "$filter": { "input": "$moduleChildren", "as": "moduleChild", "cond": { "$in": [ "$$moduleChild._id", "$permissions" ] } } } }} ])

Segunda opción ->

Vaya a su shell mongo o robomongo en cualquier GUI que esté utilizando y ejecute este comando

db.collection.update( { "permissions": { "$ne": { "$type": "array" } } }, { "$set": { "permissions": [] } }, { "multi": true } )