2

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

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

4

2 回答 2

1

虽然通过大量努力(以及非常冗长的管道)可能使当前的聚合框架输出类似的结构,但它并不简单或不合适。聚合框架旨在聚合文档并生成摘要、组等。虽然它可以对数据进行投影,但如果您需要在结果中包含多个字段,您会发现它很麻烦。

还值得看看当前框架的局限性。2.4 的结果不能超过 16MB。

我建议您在客户端上构建结构。它将数据库从繁忙的工作中解放出来,并将工作分配给客户。如果它是一个大型结构,则无论如何都应该考虑缓存结果。

于 2013-09-26T10:51:33.273 回答
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
}
于 2015-02-22T22:56:44.480 回答