【发布时间】:2021-12-11 15:42:47
【问题描述】:
我在 MongoDB 4.0 (pymongo) 中有三个集合
users: [
{_id: "aaa", name: "John", user_type: "writer", department: {value: "1", label:"press"}},
{_id: "bbb", name: "Charles", user_type: "writer", department: {value: "1", label:"press"}},
{_id: "ccc", name: "Jessy", user_type: "admin_writer", department: {value: "1", label:"press"}},
{_id: "ddd", name: "Tim", user_type: "writer", department: {value: "2", label:"news"}},
{_id: "eee", name: "Max", user_type: "admin_writer", department: {value: "2", label:"news"}},
{_id: "fff", name: "Julia", user_type: "admin", department: {value: "2", label:"news"}},
{_id: "ggg", name: "Arnold", user_type: "writer", department: {value: "3", label:"infos"}}
]
departments: [
{_id: 1, name: "press", group: "times"},
{_id: 2, name: "news", group: "times"},
{_id: 3, name: "infos", group: "herald"}
]
docs: [
{_id: 1, name: "monday", user_id: "aaa"},
{_id: 2, name: "tuesday", user_id: "bbb"},
{_id: 3, name: "wednesday", user_id: "ddd"},
{_id: 4, name: "thursday", user_id: "ddd"},
{_id: 5, name: "friday", user_id: "ggg"}
]
在我的示例中,用户可以编写文档并在部门工作。部门由组(社会)定义。作家只能看到他的文档,admin_writer 可以看到他部门的所有文档,包括他编写的文档,管理员可以看到组中的所有文档,即使他在特定部门工作。
当用户登录应用程序时,我需要在仪表板中列出所有文档
例如,结果将是:
John (writer) : [{name: "monday"}]
Jessy (admin_writer) : [{name: "monday"}, {name: "tuesday"}]
Max (admin_writer) : [{name: "wednesday"}, {name: "thursday"}]
Julia (admin) : [{name: "monday"}, {name: "tuesday"},{name: "wednesday"}, {name: "thursday"}]
Arnold (writer) : [{name: "friday"}]
为此,我管理每个特定 user_type 的查询。对于作家,我使用 $match 因为 user_id 直接在 docs 集合中,但对于其他两个 user_type,我需要使用 $lookup 在外部集合中添加条件。我尝试了两种方法(我使用 Pymongo):
user_department = 1
db.docs.aggregate([{
'$lookup': {
'from': "users",
'localField': "user_id",
'foreignField': "_id",
'as': "user"
}
},{
"$addFields": {
"user": {
"$arrayElemAt": [
{
"$filter": {
"input": "$user",
"as": "userId",
"cond": {
"$eq": ["$$userId.department.value", user_department]
}
}
}, 0
]
}
}
}, {'$project: {'name': 1}]);
或
db.docs.aggregate([{
"$lookup": {
"from": "users",
"let": {
'id': "$user_id"
},
"pipeline": [
{
'$match': {
'$expr': {
'$eq': [
"$_id",
"$$id"
]},
"_id": user_department
}
}
],
"as": "user"
}
}]);
在我的两次尝试中,我没有预期的结果。当我与 admin_writer (Jessy) 联系时,我也有来自其他部门和小组的“星期五”文档。如果您知道它发生的原因或其他解决方案,谢谢
【问题讨论】:
标签: mongodb mongodb-query pymongo