首页 > 解决方案 > 如何在 mongo 聚合中使用 map 内部查找来查找数组中的所有元素

问题描述

假设我有两个系列

集合 1 是“个人”

{
 "id":string
 "name":string
 "DOB":date
 "occupation":string
}

集合 2 是“connectionsWith”

{
"individualId":string
"type":"friends":string
"connectionIds":[]
}

使用的聚合查询是

db.individual.aggregate([
{
    "$match":{
        "_id":"bbin.ens3pvjeej0vg1bn3tcjr"
    }
},
{
    "$lookup":
   {
     "from": "connectionsWith",
     "localField": "_id",
     "foreignField": "individualId",
     "as": "connections",

   }
},
{
    "$project":
    {
        "_id":1,
        "name":1,
        "connections":1
    }
}
])

这里的输出给了我 ID 数组中的连接,现在我想显示连接的名称而不是 ID。我猜使用地图将是解决方案,但它不允许我在地图中使用查找名称。任何建议都会非常有帮助。几个小时以来一直在研究这个

谢谢

标签: mongodb

解决方案


如果我理解正确,您想用连接的对象替换现有的根。为此,您不需要在 a中执行$lookupa $map。相反,您应该使用$unwind$replaceRoot阶段。

由于$lookup将注入一个新connections数组,因此您想要的是获得一个顶级对象数组,每个对象都有一个查找到的连接。这就是这样$unwind做的。

之后,可以在每种情况下用连接本身替换初始根。

虽然我只对其进行了部分测试,但您的完整解决方案可能看起来像这样。查看下面的最后两个聚合阶段:

db.individual.aggregate([
{
    "$match":{
        "_id":"bbin.ens3pvjeej0vg1bn3tcjr"
    }
},
{
    "$lookup":
   {
     "from": "connectionsWith",
     "localField": "_id",
     "foreignField": "individualId",
     "as": "connections",

   }
},
{
    "$project":
    {
        "_id":1,
        "name":1,
        "connections":1
    }
},
{
    "$unwind": "$connections"
},
{
    "$replaceRoot":
    {
        "newRoot": "$connections"
    }
}
])

推荐阅读