MongoDB - применить аналогичный поиск для нескольких столбцов в основной таблице - PullRequest
1 голос
/ 01 мая 2019

Я новичок в MongoDB, я пытаюсь собрать полную информацию о студентах в ссылках на другие коллекции.

students структура коллекции:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        ObjectId("5cc973dd008221192148176f"), 
        ObjectId("5cc973dd0082211921481770")
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}

staff структура коллекции:

{
    "_id" : ObjectId("5cc973dd008221192148176f"),
    "name" : "John Paul",
    "subject" : [ 
        "english", 
        "maths"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481771"),
    "name" : "Pattrick",
    "subject" : [ 
        "physics", 
        "history"
    ]
}
{
    "_id" : ObjectId("5cc973dd0082211921481732"),
    "name" : "Roger",
    "subject" : [ 
        "sweeper"
    ]
}
{
    "_id" : ObjectId("5cc973dd008221192148173f"),
    "name" : "Ken",
    "subject" : [ 
        "dentist"
    ]
}

Это запрос, который я использовал для получения всех данных учителя конкретного ученика.

Запрос:

db.getCollection('students').aggregate([
  {
    $unwind: "$teachers"
  },      
  {
    $lookup:
    {
        from: 'staff',
        localField: 'teachers',
        foreignField: '_id',
        as: 'teachers'
    }
  }
]);

Результат:

{
    "_id" : ObjectId("5cc973dd008221192148177a"),
    "name" : "James Paulson",
    "teachers" : [ 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "John Paul",
            "subject" : [ 
                "english", 
                "maths"
            ]
        }, 
        {
            "_id" : ObjectId("5cc973dd008221192148176f"),
            "name" : "Pattrick",
            "subject" : [ 
                "physics", 
                "history"
            ]
        }
    ],
    "attenders": [ 
        ObjectId("5cc973dd0082211921481732"), 
        ObjectId("5cc973dd008221192148173f")
    ]
}

Как видите, массив attenders также похож на teachersкроме разницы в названии столбца в таблице студентов.Так как же применить аналогичный запрос ко второму столбцу (attenders)?Также есть ли способ выбрать определенные столбцы из второй таблицы (например, только _id и name из staff collection)?

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

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

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

Во-первых, вам не нужно использовать $unwind здесь, поскольку ваше поле уже содержит массив ObjectId s. А чтобы выбрать конкретное поле из указанной коллекции, вы можете использовать пользовательские $lookup с конвейером и $project поля внутри него.

db.getCollection('students').aggregate([
  { "$lookup": {
    "from": "staff",
    "let": { "teachers": "$teachers" },
    "pipeline": [
       { "$match": { "$expr": { "$in": [ "$_id", "$$teachers" ] } } }
       { "$project": { "name": 1 }}
     ],
     "as": "teachers"
  }},
  { "$lookup": {
    "from": "attenders",
    "let": { "attenders": "$attenders" },
    "pipeline": [
       { "$match": { "$expr": { "$in": [ "$_id", "$$attenders" ] } } }
     ],
     "as": "attenders"
  }}
])
...