根据学生ID汇总多个集合

时间:2018-11-21 16:28:06

标签: arrays mongodb mongoose mongodb-query aggregation-framework

我正在尝试根据学生的ID在MongoDB中汇总2个集合。一个集合包含学生的个人信息,另一个集合包含学生的日志。问题是数据在数组中,这就是为什么我认为聚合不起作用的原因。任何帮助将不胜感激。

学生集合

{
    "_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 :(得分:2)

您可以在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"] }]}
        }
      }
    }
  }}
])

输出

[
  {
    "students": [
      {
        "activity": "11112,334,123",
        "name": "John",
        "studentId": 1
      },
      {
        "activity": "11112,334,123",
        "name": "Sandy",
        "studentId": 2
      }
    ]
  }
]