Как поместить все значения в один массив в mongodb - PullRequest
1 голос
/ 09 мая 2019

Колледжи

/* 1 createdAt:5/9/2019, 7:00:04 PM*/
{
    "_id" : ObjectId("5cd42b5c65b41027845938ae"),
    "clgID" : "100",
    "name" : "Anna University"
},

/* 2 createdAt:5/9/2019, 7:00:04 PM*/
{
    "_id" : ObjectId("5cd42b5c65b41027845938ad"),
    "clgID" : "200",
    "name" : "National"
}

Тематика:

/* 1 createdAt:5/9/2019, 7:03:24 PM*/
{
    "_id" : ObjectId("5cd42c2465b41027845938b0"),
    "name" : "Hindi",
    "members" : {
        "student" : [
            "123"
        ]
    },
    "college" : {
        "collegeID" : "100"
    }
},

/* 2 createdAt:5/9/2019, 7:03:24 PM*/
{
    "_id" : ObjectId("5cd42c2465b41027845938af"),
    "name" : "English",
    "members" : {
        "student" : [
            "456",
            "789"
        ]
    },
    "college" : {
        "collegeID" : "100"
    }
}

Здесь у меня две коллекции, и я хочу объединить Colleges таблица clgID и Subjects таблица college.collegeID, затем я хочу взять members.student значения и вставить в один массив на основе college.collegeID.

Мой ожидаемый результат

{
    "GroupDetails" : [ ],
    "clgName" : "National"
},
{
    "GroupDetails" : [
        "123",
        "456",
        "789"
    ],
    "clgName" : "Anna University"
}

Мой код

db.Colleges.aggregate([
    { $match : { "clgID" : { $in :  ["100", "200"]  } } },
    { $lookup: { from: "Subjects", localField: "clgID", foreignField: "college.collegeID", as: "GroupDetails" } },
    //{ $unwind: "$GroupDetails" },
    { $project: { '_id' : false, 'clgName' : '$name', 'GroupDetails.members.student' : true } }
])

Я получаю вот так

/* 1 */
{
    "GroupDetails" : [ ],
    "clgName" : "National"
},

/* 2 */
{
    "GroupDetails" : [
        {
            "members" : {
                "student" : [
                    "456"
                ]
            }
        },
        {
            "members" : {
                "student" : [
                    "123"
                ]
            }
        }
    ],
    "clgName" : "Anna University"
}

1 Ответ

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

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

db.Colleges.aggregate([
  { "$match": { "clgID": { "$in": ["100", "200"] } } },
  { "$lookup": {
    "from": "Subjects",
    "let": { "clgId": "$clgID" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$$clgId", "$college.collegeID"] } } },
      { "$group": {
        "_id": "$college.collegeID",
        "groupDetails": { "$push": "$members.student" }
      }},
      { "$project": {
        "groupDetails": {
          "$reduce": {
            "input": "$groupDetails",
            "initialValue": [],
            "in": { "$concatArrays": ["$$this", "$$value"] }
          }
        }
      }}
    ],
    "as": "clg"
  }},
  { "$unwind": { "path": "$clg", "preserveNullAndEmptyArrays": true } },
  { "$project": {
    "clgName": "$name",
    "groupDetails": { "$ifNull": ["$clg.groupDetails", []] }
  }}
])

MongoPlayground

Или с mongodb 3.4 и ниже

db.Colleges.aggregate([
  { "$match": { "clgID": { "$in": ["100", "200"] }}},
  { "$lookup": {
    "from": "Subjects",
    "localField": "clgID",
    "foreignField": "college.collegeID",
    "as": "clg"
  }},
  { "$unwind": { "path": "$clg", "preserveNullAndEmptyArrays": true }},
  { "$group": {
    "_id": { "clgId": "$clg.college.collegeID", "_id": "$_id" },
    "groupDetails": { "$push": "$clg.members.student" },
    "clgName": { "$first": "$name" }
  }},
  { "$project": {
    "_id": "$_id._id",
    "clgName": 1,
    "groupDetails": {
      "$reduce": {
        "input": "$groupDetails",
        "initialValue": [],
        "in": { "$concatArrays": ["$$this", "$$value"] }
      }
    }
  }}
])

MongoPlayground

...