我有表示树层次结构元数据的集合,站点和地理位置集合,一个元可以有多个站点,一个站点可以有多个地理位置
元集合
{
"_id": "1",
"meta_id": 1,
"meta_name": "yankung"
}网站集
{
"_id": "1",
"meta_id": 1,
"site_id" :2,
"site_name": "uoop"
}地理集合
{
"_id": "1",
"site_id": 2,
"geo_id" :3,
"geo_name": "toop"
}我必须像这样得到最终的结果
{
"_id": "1",
"meta_id": 1,
"meta_name": "yankung",
"sites": [
{
"site_id": 2,
"site_name": "uoop",
"geos:": [
{
"geo_id": 3,
"geo_name": "toop"
},
{
"geo_id": 4,
"geo_name": "toop"
}
]
},
{
"site_id": 1000,
"site_name": "uoop",
"geos:": [
{
"geo_id": 5,
"geo_name": "toop"
},
{
"geo_id": 6,
"geo_name": "toop"
}
]
}
]
}我尝试使用聚合查询和查找,展开能够将站点和地理位置分离为列表,我想从应用程序级别获得所需的结果,但必须迭代每个文档并添加,这将增加时间复杂性,有没有关于如何继续的帮助?
这就是我所能做到的
{
"_id": "1",
"meta_id": 1,
"meta_name": "yankung",
"sites": [
{ "site_id": 2, "site_name": "uoop"
},
{"site_id": 1000,"site_name": "uoop"
}
],
"geos:": [
{ "geo_id": 5,"geo_name": "toop"
},
{"geo_id": 6,"geo_name": "toop"
}
]
}发布于 2020-07-11 18:10:19
诀窍是使用$lookup with join conditions and uncorrelated subqueries。通过这种方式,您可以在$lookup中定义$lookup。
下面是查询:
db.meta_collection.aggregate([
{
$lookup: {
from: "site_collection",
let: {
meta: "$meta_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$meta_id",
"$$meta"
]
}
}
},
{
$lookup: {
from: "geo_collection",
let: {
site: "$site_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$site_id",
"$$site"
]
}
}
},
],
as: "geos"
}
}
],
as: "sites"
}
}
])你可以在here上测试它
https://stackoverflow.com/questions/62839927
复制相似问题