Объединить несколько коллекций на основе идентификатора студента - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь объединить 2 коллекции в MongoDB на основе идентификатора студента.Одна коллекция состоит из личной информации студентов, другая - из журналов студентов.Проблема в том, что данные находятся в массиве, поэтому я думаю, что моя агрегация не работает.Любая помощь будет оценена.

коллекция студентов

{
    "_id" : ObjectId("(Object ID here"),
    "data" : [ 
        {
            "name" : "John",
            "id" : 1
        }, 
        {
            "name" : "Sandy",
            "id" : 2
        }
    ]
}

коллекция журналов

{
    "_id" : ObjectId("(Object ID here"),
    "logs" : [ 
        {
            "studentId" : 1,
            "activity" : "11112,334,123"
        }, 
        {
            "studentId" : 2,
            "activity" : "11112,334,123"
        }
    ]
}

Вот что япробовал:

dbo.collection("student").aggregate([
    { "$lookup": {
        "localField": "data.id",
        "from": "logs",
        "foreignField": "logs.studentId",
        "as": "studentInfo"
    }
    }]).toArray(function(err, results) {
        console.log(results);
    });

Ожидаемый результат:

studentinfo: {
    id: 1,
    name: "John",
    activity" : "11112,334,123"
}

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете использовать агрегацию ниже с mongodb 3.6

Таким образом, в основном ваше внешнее поле представляет собой массив, который необходимо использовать $lookupс конвейером на $unwind внешний массив внутри $lookup конвейера и в соответствии с соответствующим ids.

db.students.aggregate([
  { "$lookup": {
    "from": "logs",
    "let": { "dataId": "$data.id" },
    "pipeline": [
      { "$unwind": "$logs" },
      { "$match": { "$expr": { "$in": ["$logs.studentId", "$$dataId"] }}},
      { "$replaceRoot": { "newRoot": "$logs" }}
    ],
    "as": "students"
  }}
])

или используйте это для объединения обоих массивов

db.students.aggregate([
  { "$lookup": {
    "from": "logs",
    "let": { "dataId": "$data.id" },
    "pipeline": [
      { "$unwind": "$logs" },
      { "$match": { "$expr": { "$in": ["$logs.studentId", "$$dataId"] }}},
      { "$replaceRoot": { "newRoot": "$logs" }}
    ],
    "as": "students"
  }},
  { "$project": {
    "students": {
      "$map": {
        "input": "$students",
        "in": {
          "studentId": "$$this.studentId",
          "activity": "$$this.activity",
          "name": { "$arrayElemAt": ["$data.name", { "$indexOfArray": ["$data.id", "$$this.studentId"] }]}
        }
      }
    }
  }}
])

Output

[
  {
    "students": [
      {
        "activity": "11112,334,123",
        "name": "John",
        "studentId": 1
      },
      {
        "activity": "11112,334,123",
        "name": "Sandy",
        "studentId": 2
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...