在树状结构中聚合文档

时间:2013-09-26 09:16:26

标签: mongodb aggregation-framework

我有一个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" } ] }, 
      ...
    ]
  }
}

我对使用聚合框架执行此操作有多难感到兴趣,还是有可能这样做?或者更好地在客户端计算这个?

2 个答案:

答案 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
}