首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用$lookup和$in mongodb聚合

如何使用$lookup和$in mongodb聚合
EN

Stack Overflow用户
提问于 2019-05-10 08:22:16
回答 2查看 188关注 0票数 2

学院

代码语言:javascript
复制
{
    "_id" : ObjectId("5cd42b5c65b41027845938ae"),
    "clgID" : "100",
    "name" : "Vivekananda"
},

{
    "_id" : ObjectId("5cd42b5c65b41027845938ad"),
    "clgID" : "200",
    "name" : "National"
}

要点:1 =>从学院收集的全部clgID

主题:

代码语言:javascript
复制
{
    "_id" : ObjectId("5cd42c2465b41027845938b0"),
    "name" : "Hindi",
    "members" : {
        "student" : [
            "123"
        ]
    },
    "college" : {
        "collegeID" : "100"
    }
},

{
    "_id" : ObjectId("5cd42c2465b41027845938af"),
    "name" : "English",
    "members" : {
        "student" : [
            "456",
            "789"
        ]
    },
    "college" : {
        "collegeID" : "100"
    }
}

要点:2 => Subjects集合我们将clgID映射到college.collegeID下,主题集合需要基于clgIDmembers.student值。

CollegeProducts

代码语言:javascript
复制
{
    "_id" : "123",
    "StudentProdcutID" : "123",
    "StudentID" : "FF80",
    "CID" : "Facebook"
},
{
    "_id" : "456",
    "StudentProdcutID" : "456",
    "StudentID" : "FF81",
    "CID" : "Facebook"
},
{
    "_id" : "789",
    "StudentProdcutID" : "789",
    "StudentID" : "FF82",
    "CID" : "Facebook"
}

要点:3 => CollegeProducts集合我们将members.student值映射到StudentProdcutID下,CollegeProducts集合我们需要在StudentID中获取值。CollegeProducts集合我们需要检查条件,CID应该是Facebook,并基于members.studentStudentID的值。

UserDetails

代码语言:javascript
复制
{
    "name" : "A",
    "StudentID" : "FF80"

},
{
    "name" : "B",
    "StudentID" : "FF81"
},
{
    "name" : "C",
    "StudentID" : "FF82"
}

要点:3 => UserDetails集合我们将StudentID值映射到StudentID下,UserDetails集合我们需要使用name的值。

预期产出:

代码语言:javascript
复制
{
"collegeName" : "National",
"StudentName" : "A"
},
{
"collegeName" : "National",
"StudentName" : "B"
},
{
"collegeName" : "National",
"StudentName" : "C"
}

我的密码

代码语言:javascript
复制
 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"] }
      }
    }
  }}
])

我没有得到我的预期产出,请帮助我的任何人。我使用的是mongodb版本3.4

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 09:32:45

如果您希望每个输出都是一个用户,就不要麻烦地分组,您只是做了两倍的工作。

将查询更改为:

代码语言:javascript
复制
    { 
        "$match" : {
            "clgID" : {
                "$in" : [
                    "100", 
                    "200"
                ]
            }
        }
    }, 
    { 
        "$lookup" : {
            "from" : "Subjects", 
            "localField" : "clgID", 
            "foreignField" : "college.collegeID", 
            "as" : "clg"
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$clg", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$clg.members.student", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$project" : {
            "collegeName" : "$name", 
            "student" : "$clg.members.student"
        }
    }
], 

现在,通过第二个展开,每个对象都包含了大学名称和-一个学生,所以我们现在需要做的就是以所需的形式进行项目。

编辑:根据请求进行完整查询

代码语言:javascript
复制
    { 
        "$match" : {
            "clgID" : {
                "$in" : [
                    "100", 
                    "200"
                ]
            }
        }
    }, 
    { 
        "$lookup" : {
            "from" : "Subjects", 
            "localField" : "clgID", 
            "foreignField" : "college.collegeID", 
            "as" : "clg"
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$clg", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$unwind" : {
            "path" : "$clg.members.student", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$lookup" : {
            "from" : "CollegeProducts", 
            "localField" : "clg.members.student", 
            "foreignField" : "StudentProdcutID", 
            "as" : "clgproduct"
        }
    }, 
    {   // can skip this unwind if theres always only one match.
        "$unwind" : {
            "path" : "$clgproduct", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$match" : {
            "clgproduct.CID" : "Facebook"
        }
    }, 
    { 
        "$lookup" : {
            "from" : "UserDetails", 
            "localField" : "clgproduct.StudentID", 
            "foreignField" : "StudentID", 
            "as" : "student"
        }
    }, 
    {   // can skip this unwind if theres always only one user matched.
        "$unwind" : {
            "path" : "$student", 
            "preserveNullAndEmptyArrays" : true
        }
    }, 
    { 
        "$project" : {
            "collegeName" : "$name", 
            "student" : "$student.name"
        }
    }
], 
票数 1
EN

Stack Overflow用户

发布于 2019-05-10 09:45:26

您可以使用下面的聚合

代码语言:javascript
复制
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"] }
      }
    }
  }},
  { "$lookup": {
    "from": "CollegeProduct",
    "localField": "groupDetails",
    "foreignField": "StudentProdcutID",
    "as": "CollegeProduct"
  }},
  { "$unwind": "$CollegeProduct" },
  { "$lookup": {
    "from": "UserDetails",
    "localField": "CollegeProduct.StudentID",
    "foreignField": "StudentID",
    "as": "Student"
  }},
  { "$unwind": "$Student" },
  { "$project": { "collegeName": "clgName", "StudentName": "$Student.name" }}
])

MongoPlayground

Output

代码语言:javascript
复制
[
  {
    "StudentName": "A",
    "_id": ObjectId("5cd42b5c65b41027845938ae"),
    "collegeName": "clgName"
  },
  {
    "StudentName": "B",
    "_id": ObjectId("5cd42b5c65b41027845938ae"),
    "collegeName": "clgName"
  },
  {
    "StudentName": "C",
    "_id": ObjectId("5cd42b5c65b41027845938ae"),
    "collegeName": "clgName"
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56073497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档