如何在mongo聚合中对映射中的所有元素使用map内部查找

时间:2018-07-07 22:36:30

标签: mongodb

让我说我有两个收藏夹

集合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。我猜想使用map是解决方案,但不允许我对map中的名称使用查找。任何建议都会很有帮助。从几个小时开始就抓挠了

谢谢

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想用连接的对象替换现有的根。为此,您无需在 $lookup 内执行 $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"
    }
}
])