Внутри моей БД у меня есть две коллекции:
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 Collection
- id : ObjectID(own)
- groupName: string
- groupAdmin: ObjectID(of user)
- members: Array
[
ObjectID(of a user),
ObjectID(of a user),
....more
]
что я пытаюсь сделать, это
когда предоставляется идентификатор пользователя (ObjectID)
получить массив всех тем, которые может видеть пользователь.
пользователь может видеть предмет по двум критериям:
если они являются субъектом Создателя
, если они являются членами группы, которую субъект включает в поле groups
Я понимаю, что это своего рода агрегация между двумя запросами,
но я не могу привести пример моего собственного испытания, потому что я новичок в MongoDB,
и даже не знаю, как к нему подойти.
Я думаю (возможно, неправильно), что если бы это было написано на сервере SQL, это выглядело бы так:
с параметром @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 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
]