Получить общий идентификатор нескольких коллекций в Mongodb? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть несколько коллекций пользователей в Mongodb.Как показано ниже:

userCollection1:
User1: {name:xxx,
id:xxx
<other fields>}

User2: {name:xxx,
id:xxx
<other fields>}

..other users..

userCollection2:
User1: {name:xxx,
id:xxx
<other fields>}

User3: {name:xxx,
id:xxx
<other fields>}

..other users..

userCollection3:{}  //All same scheme as previous collection
userCollection4:{}
userCollection5:{}

Каждый представляет собой отдельную коллекцию различных списков пользователей.Сейчас я пытаюсь привлечь пользователей, которые существуют во всех этих 5 коллекциях.

Один из способов, который я могу придумать, - это цикл.

Для каждого пользователя в коллекции1,

Запросить его идентификатор или имя в коллекции 2, 3, 4, 5.

, если идентификатор находится во всехколлекции, запишите его идентификатор.

В противном случае пропустите.

Затем перейдите к следующему пользователю.

Мне кажется, этот метод не очень эффективен.Может быть какой-то лучший способ использования агрегатного метода mongodb.

Есть какие-нибудь предложения по этой ситуации?Или мне просто нужно использовать цикл for?

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Поскольку вы ищете обычного пользователя во всех 5 коллекциях, мы сделаем запрос к коллекции пользователя 1 и используем $ lookup и присоединимся ко всем остальным 4 коллекциям. Вот предложение запроса, которое определенно будет работать.

Вся коллекция пользователей имеет ту же схему, что и упомянутая выше: имя и рабочее поле.

db.getCollection('user1').aggregate({ "$facet": { "presentInAllCollections": [{ "$lookup": { "from": "user2", "localField": "name", "foreignField": "name", "as": "User2" } }, { "$lookup": { "from": "user3", "localField": "name", "foreignField": "name", "as": "User3" } }, { "$lookup": { "from": "user4", "localField": "name", "foreignField": "name", "as": "User4" } }, { "$lookup": { "from": "user5", "localField": "name", "foreignField": "name", "as": "User5" } }] } }, { $project: { "foundUser": { $filter: { input: '$presentInAllCollections', as: 'arrayElement', cond: { "$and": [{ $ne: ['$$arrayElement.User2', []] }, { $ne: ['$$arrayElement.User3', []] }, { $ne: ['$$arrayElement.User4', []] }, { $ne: ['$$arrayElement.User5', []] } ] } } } } })
1 голос
/ 06 июля 2019

Вы можете присоединиться ко всем 5 коллекциям пользователей, чтобы получить общие идентификаторы пользователей. Для этого вы должны использовать функцию $ lookup из конвейера агрегации.

userCollection1.aggregate([{
  $lookup:{
    from:"userCollection2", 
    localField:"id", 
    foreignField:"id",
    as:"alias_name"
     }
   }
 ]
)

Это вернет все соответствующие документы из обеих коллекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...