запрос на пересечение: кто в моей команде? - PullRequest
0 голосов
/ 27 августа 2018

Скажите: документ пользователя похож на {_id, name, teamIds: [...]}.

Я присоединился ко многим командам, и другие могут присоединиться ко многим другим командам.

Как я могу узнать всех пользователей, которые входят в одну из моих команд?

Или, если это неэффективный дизайн, лучше добавить коллекцию с помощью {teamId, userId}?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Очень просто, если ваш пользователь уже загружен (что, вероятно, так и есть).

db.users.find({_id: {$ne: me.id}, teams: {$in: me.teams}})
0 голосов
/ 27 августа 2018

Предположим, у вас есть следующие документы в ваших коллекциях пользователей,

 { 
    "_id" : 1.0, 
    "teams" : [
        1.0, 
        5.0, 
        8.0, 
        12.0, 
        10.0
    ]
}
{ 
    "_id" : 2.0, 
    "teams" : [
        1.0, 
        2.0, 
        3.0, 
        8.0, 
        10.0
    ]
}
{ 
    "_id" : 3.0, 
    "teams" : [
        4.0, 
        7.0, 
        9.0, 
        12.0
    ]
}
{ 
    "_id" : 5.0, 
    "teams" : [
        21.0, 
        45.0, 
        85.0
    ]
}

и вы хотите, чтобы все пользователи, которые разделяют любую команду с идентификатором пользователя 1. Этого можно добиться с помощью $ lookup stage:

db['users'].aggregate(
[
    {
        $match: {
        _id:1
        }
    },
    {
        $lookup: {
            from: "users",
            let: { id:"$_id", team:"$teams" },
            pipeline: [ {$match:{$expr:{$and:[
              {$ne:["$_id","$$id"]},
              {$ne:[{$setIntersection:["$teams","$$team"]},[]]}
              ]}}}],
            as: "connected_users"
         }
    },
],
);

Будет выведено:

{ 
    "_id" : 1.0, 
    "teams" : [
        1.0, 
        5.0, 
        8.0, 
        12.0, 
        10.0
    ], 
    "connected_users" : [
        {
            "_id" : 2.0, 
            "teams" : [
                1.0, 
                2.0, 
                3.0, 
                8.0, 
                10.0
            ]
        }, 
        {
            "_id" : 3.0, 
            "teams" : [
                4.0, 
                7.0, 
                9.0, 
                12.0
            ]
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...