【发布时间】:2019-10-13 15:06:06
【问题描述】:
在我的数据库中,我有两个集合:
Subjects Collection
- id : ObjectID(own)
- subjectCreator : ObjectID(of a user)
- groups : Array
[
ObjectID(of a group),
ObjectID(of a group),
....more
]
- media : Array
[
{
id : ObjectID(of media)
mediaUploader: ObjectID(of user)
other properties that not important
},
{
id : ObjectID(of media)
mediaUploader: ObjectID(of user)
other properties that not important
},
]
还有一个 Groups 集合
Groups Collection
- id : ObjectID(own)
- groupName: string
- groupAdmin: ObjectID(of user)
- members: Array
[
ObjectID(of a user),
ObjectID(of a user),
....more
]
我想做的是, 当给定用户 ID (ObjectID) 获取用户可以看到的所有主题的数组。
用户可以通过两个标准查看主题:
如果他们是主题创建者
如果他们是主题包含在
groups字段中的组的成员
我知道这是两个查询之间的一种聚合, 但我无法提供我自己的试用示例,因为我是 MongoDB 新手, 甚至不知道如何接近它。
我认为(可能是错误的)如果这是用 SQL Server 编写的,它会如下所示:
给定一个@userID 参数
SELECT distinct s.*
FROM Subjects s
WHERE @userID = s.subjectCreator
OR
@userID in (
SELECT members
FROM Groups g
WHERE g.GroupID in (
SELECT groups
FROM Subjects
WHERE s.Groups.GroupID = g.GroupID
)
)
我的服务器端是用 NodeJS 编写的
还有一个小问题,哪一个是数据库结构的最佳实践? 上面的结构, 还是下面的结构? 区别在于数组,请解释原因
Subjects Collection
- id : ObjectID(own)
- subjectCreator : ObjectID(of a user)
- groups : Array
[
{ groupID: ObjectID(of a group) },
{ groupID: ObjectID(of a group) },,
....more **OBJECTS**
]
- media : Array
[
{
id : ObjectID(of media)
mediaUploader: ObjectID(of user)
other properties that not important
},
{
id : ObjectID(of media)
mediaUploader: ObjectID(of user)
other properties that not important
},
]
还有一个 Groups 集合
Groups Collection
- id : ObjectID(own)
- groupName: string
- groupAdmin: ObjectID(of user)
- members: Array
[
{ memberID : ObjectID(of a user) },
{ memberID : ObjectID(of a user) },
....more objects of members id
]
【问题讨论】:
标签: node.js mongodb join aggregation nested-queries