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

qwe*_*rty 6 mongodb

假设我有两个集合

集合 1 是“个人”

{
 "id":string
 "name":string
 "DOB":date
 "occupation":string
}
Run Code Online (Sandbox Code Playgroud)

集合 2 是“connectionsWith”

{
"individualId":string
"type":"friends":string
"connectionIds":[]
}
Run Code Online (Sandbox Code Playgroud)

使用的聚合查询是

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

   }
},
{
    "$project":
    {
        "_id":1,
        "name":1,
        "connections":1
    }
}
])
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Teo*_*adu 1

如果我理解正确,您想用连接的对象替换现有的根。为此,您不需要$lookup在 a 的内部进行操作$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"
    }
}
])
Run Code Online (Sandbox Code Playgroud)