MongoDB поиск нескольких полей - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь выполнить $lookup, используя два поля в MongoDB 3.6.Я уже прочитал документы и подобные вопросы здесь , но я не смог найти, что не так.

Коллекция acls:

[ { _id: 1, FolderId: 4, Sid: 'S-123-456' }
  { _id: 2, FolderId: 5, Sid: 'S-234-567' }
  { _id: 3, FolderId: 6, Sid: 'S-345-678' } ]

Коллекция groups:

[ { _id: 1, ProcessId: 10, Sid: 'S-123-456', Users: [ 'user1', 'user2'] }
  { _id: 2, ProcessId: 10, Sid: 'S-234-567', Users: [ 'user1'] }
  { _id: 3, ProcessId: 20, Sid: 'S-123-456', Users: [ 'user2'] } ]

Запрос:

db.acls.aggregate({
    $lookup: 
    { 
        from: 'groups',
        let: { 'ProcessId': 10, 'GroupSid': '$Sid' },
        pipeline: [{
                   $match: {
                      $expr: {
                         $and: [
                            {
                               $eq: [ '$ProcessId', '$$ProcessId' ]
                            },
                            {
                               $eq: [ '$Sid', '$$GroupSid' ]
                            }
                         ]
                      }
                   }
                }],
        as: 'grouplist'
    }
})

Я ожидал получить что-то вроде:

{ _id: 1, FolderId: 4, Sid: 'S-123-456', 
  grouplist: [ { _id: 1, ProcessId: 10, Sid: 'S-123-456', Users: [ 'user1', 'user2'] }] }

но вместо этого я получаю 'Script executed successfully, but there are no results to show' наРобо 3Т.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Попробуйте, это работает нормально. Ваше ключевое слово let должно начинаться со строчной буквы

    db.acls.aggregate([
   {
      $lookup:
         {
           from: "groups",
           let: { processid: 10, sid: "$Sid" },
           pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$ProcessId",  "$$processid" ] },
                         { $gte: [ "$Sid", "$$sid" ] }
                       ]
                    }
                 }
              }
           ],
           as: "grouplist"
         }
    }
])
0 голосов
/ 05 октября 2018
db.getCollection("acls").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $lookup: // Equality Match
            {
                from: "groups",
                localField: "Sid",
                foreignField: "Sid",
                as: "grouplist"
            }


        },

        // Stage 2
        {
            $project: {
                grouplist: {
                    $filter: {
                        input: "$grouplist",
                        as: "group",
                        cond: {
                            $eq: ["$$group.ProcessId", 10]
                        }
                    }
                },

                FolderId: 1,
                Sid: 1
            }
        },

    ]



);
0 голосов
/ 04 октября 2018

$let переменная оператор должен начинаться со строчной буквы.

db.acls.aggregate([
  { "$lookup": { 
    "from": 'groups',
    "let": { "groupSid": "$Sid" },
    "pipeline": [
      { "$match": {
        "$expr": { "$eq": [ "$Sid", "$$groupSid" ] },
        "ProcessId": 10
      }}
    ],
    "as": "grouplist"
  }}
])
...