mongodb - 如何在 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。我猜使用地图将是解决方案,但它不允许我在地图中使用查找名称。任何建议都会非常有帮助。几个小时以来一直在研究这个
谢谢
解决方案
如果我理解正确,您想用连接的对象替换现有的根。为此,您不需要在 a中执行$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"
}
}
])
推荐阅读
- mysql - 找出条件mysql 5.7中每个用户的时差
- aws-lambda - Kong调用的lambda中的HTML有双引号
- python - 烧瓶查询日期时间和整数值
- php - CodeIgniter -> php spark 服务不工作
- python - 如何使用beautifulsoup从这个html中提取链接
- gatling - 如何使用加特林馈线在整个持续时间内为每个用户使用一次数据?
- python - 不存在同名列时出现歧义列错误
- java - 尝试接受 Android Studio 许可证时,我不断收到此错误“java.lang.NoClassDefFoundError”
- apache-spark - org.apache.spark.sql.AnalysisException:未定义函数:'coalesce'
- javascript - 为什么在 html 元素之前显示警报