dav*_*idM 4 arrays mongodb mongodb-query aggregation-framework
任何人都可以告诉我,我做错了什么?
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"
]
}
Run Code Online (Sandbox Code Playgroud)
管道阶段:
{ $project: {
filteredChildren: {
$filter: {
input: "$moduleChildren",
as: "moduleChild",
cond: { $in : ["$$moduleChild._id", "$permissions"] }
}
},
}}
Run Code Online (Sandbox Code Playgroud)
我需要过滤"moduleChildren"数组以仅显示哪些ID在"权限"数组中.我试过"$$ ROOT.permissions"和"$$ CURRENT.permissions",但没有一个能正常工作.我总是得到一个错误,$ in缺少数组作为参数.当我像这样硬编码数组时它起作用:cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] }所以看起来问题在于传递数组.谢谢你的任何建议!
第一个选项 - >使用聚合
因为您的集合中的某些文档可能包含permissions 字段,也可能不包含字段,或者类型不等于数组,这就是您收到此错误的原因.
您可以找到该$type字段的字段,如果它不是数组或不存在于您的文档中,那么您可以将其添加为数组$addFields和$cond聚合
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" ]
}
}
}
}}
])
Run Code Online (Sandbox Code Playgroud)
第二个选项 - >
在您使用的任何GUI上转到您的mongo shell或robomongo并运行此命令
db.collection.update(
{ "permissions": { "$ne": { "$type": "array" } } },
{ "$set": { "permissions": [] } },
{ "multi": true }
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1589 次 |
| 最近记录: |