Какой-то запрос объединения-объединения в MongoDB - PullRequest
0 голосов
/ 28 мая 2019

Внутри моей БД у меня есть две коллекции:

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) получить массив всех тем, которые может видеть пользователь.

пользователь может видеть предмет по двум критериям:

  1. если они являются субъектом Создателя

  2. , если они являются членами группы, которую субъект включает в поле 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
            ]

1 Ответ

1 голос
/ 28 мая 2019

Для первого вопроса наша стратегия будет заключаться в том, чтобы использовать $ lookup , чтобы "объединить" эти коллекции и затем запросить их.это делает запросы более «чистыми» и, по моему опыту, сэкономит ваше время и ресурсы в будущем при преобразовании [{_id: 1}, {_id: 2}] в [1, 2] по любой причине.

Обратите внимание, что они эквивалентны «мощности»,то есть, что может быть достигнуто с его помощью.

Также я не совсем уверен, насколько большой будет нагрузка, но я представляю, что индексировать это поле как массив намного проще для монго в таком случае.

...