我有一个mongo集合,里面装满了以下文档:
{
area: "Some area",
group: "group name", // area includes different groups
name: "name" // there are many names in each group
}
对于前端我需要树状结构:
{ _id: "area name",
name: "same as _id",
ap: {
children: [
{ name: "group name, children: [ { name: "name from the doc" } ] },
...
]
}
}
我对使用聚合框架执行此操作有多难感到兴趣,还是有可能这样做?或者更好地在客户端计算这个?
答案 0 :(得分:1)
虽然有可能让当前的聚合框架通过大量的工作(以及非常冗长的管道)输出类似的结构,但它并不简单或不合适。聚合框架旨在聚合文档并生成摘要,组等。虽然它可以对数据进行投影,但如果在结果中需要多个字段,则会发现它很麻烦。
目前还值得研究框架的局限性here。 2.4的结果总共不能超过16MB。
我建议你在客户端上构建结构。它使数据库免于繁忙工作并将工作分配给客户。如果它是一个大型结构,你应该考虑缓存结果。
答案 1 :(得分:0)
除了WiredPrairies接受的答案,如果你需要快速树形图的大小/边界,你可以这样做,如下所示。
db.appconsumers.aggregate(
{$unwind: "$taxonomies"},
{$project:
{"tier1" : "$taxonomies.tier1",
"tier2" : "$taxonomies.tier2",
"tier3" : "$taxonomies.tier3",
"tier4" : "$taxonomies.tier4",
"tier5" : "$taxonomies.tier5"}},
{$group:
{_id: {"tier1":"$tier1", "tier2": "$tier2", "tier3":"$tier3", "tier4":"$tier4","tier5":"$tier5"}, count:{$sum: 1}}})
输出
{
"_id" : {
"tier1" : "Arts & Entertainment",
"tier2" : "Movies",
"tier3" : "Kill Bill"
},
"count" : 15
},
{
"_id" : {
"tier1" : "Arts & Entertainment",
"tier2" : "Movies"
},
"count" : 20
},
{
"_id" : {
"tier1" : "Arts & Entertainment",
"tier2" : "Movies",
"tier3" : "Kill Bill",
"tier4" : "Main characters",
"tier5" : "Bill"
},
"count" : 5
}