有人可以告诉我我在做什么错吗?
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"
]
}
管道阶段:
{ $project: {
filteredChildren: {
$filter: {
input: "$moduleChildren",
as: "moduleChild",
cond: { $in : ["$$moduleChild._id", "$permissions"] }
}
},
}}
我需要过滤“ moduleChildren”数组以仅显示ID在“ permissions”数组中的模块。 Ive尝试了“ $$ ROOT.permissions”和“ $$ CURRENT.permissions”,但是它们都不起作用。我总是得到一个错误,即$ in缺少数组作为参数。当我像这样对数组进行硬编码时,它可以工作:cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] }
,因此看来问题出在数组的传递中。
感谢您的任何建议!
答案 0 :(得分:7)
第一个选项->使用汇总
因为您集合中的某些文档可能包含或可能不包含 permissions
字段,或者类型不等于数组,这就是您收到此错误的原因。
您可以找到该字段的$type
,如果它不是数组或在文档中不存在,则可以将其添加为具有$addFields
和$cond
聚合的数组< / p>
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" ]
}
}
}
}}
])
第二个选项->
在使用的任何GUI上转到mongo shell或robomongo并运行 此命令
db.collection.update(
{ "permissions": { "$ne": { "$type": "array" } } },
{ "$set": { "permissions": [] } },
{ "multi": true }
)