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 }
)