【问题标题】:mongodb unwind aggregate result?mongodb展开汇总结果?
【发布时间】:2015-03-25 20:22:51
【问题描述】:

所以我正在尝试使用聚合在我的数据库中生成一些统计数据

我当前的脚本如下所示:

db.posts.aggregate( [
    { $group: {_id : "$domain", "counter" : {$sum : 1}}},
    { $sort : { counter : -1}},
    { $match : { counter : {$gt : 10} } }
])

并产生如下结果:

{
    "result" : [ 
        {
            "_id" : "i.imgur.com",
            "counter" : 1220
        }, 
        {
            "_id" : "imgur.com",
            "counter" : 459
        }         
    ],
    "ok" : 1
}

相当满意,但我想更进一步。我正在使用 robomongo(对我来说更舒服),这对我来说就像单个文档:

我希望每个结果都成为一个单独的文档,如下所示:

   | _id         | counter
---+-------------+--------
 1 | i.imgur.com | 1220
---+-------------+--------
 2 | imgur.com   | 459

我以为我需要使用 $unwind,但惨遭失败:将 { $unwind : "$result"} 添加到聚合链会产生以下输出:

/* 0 */
{
    "result" : [],
    "ok" : 1
}

我做错了什么以及如何做对?

【问题讨论】:

  • 首先,您是否在单个数组中获得了您想要的所有结果?其次,如果是格式问题,那么最好手动编写代码。
  • $project 应该可以解决问题。您能否提供结果的示例 JSON 对象?
  • 顺便说一下,$match 在管道中的位置越高越好。尽管在使用小数据集时可能不会注意到性能上的真正差异,但为了获得最佳实践,最好将顺序切换为 $group$match$sort
  • @AshwinBalamohan 是的,这里是:pastebin.com/1kWp4zKY

标签: mongodb aggregation-framework


【解决方案1】:

我不使用 robomongo,但您似乎可以在脚本中添加 .result 以获得所需的结果输出。

db.posts.aggregate( [
    { $group: {_id : "$domain", "counter" : {$sum : 1}}},
    { $sort : { counter : -1}},
    { $match : { counter : {$gt : 10} } }
]).result

我已经对此进行了一些研究,看来您得到的返回输出是 robomongo 使用 db.posts.runCommand("aggregate", {pipeline: [<array of pipeline operators>]}) 的结果,而不是“实例化游标”而不是创建游标的 aggregate() 助手。

我认为除了提交罚单之外,您无能为力。

【讨论】:

  • 老实说,这是我尝试的第一件事,但结果是具有两个字段(0 和 1)的单个文档,每个字段都是具有 _idcounter 字段的对象:i.imgur.com/86VDbIi.png
  • 编辑中:哦,好吧。无论如何,这对我来说并不重要。我想我会为这个问题在 github 上打开一个问题
  • 哦,已经有两个了#507#522。我相信这回答了我的问题。
  • @amdc 和“NoOutlet”按顺序表示这是您的回复。目前,Robomongo 构建在命令和结果方面“锁定”在 MongoDB 2.4.x 代码库中。所以.aggregate() 不能像在最近版本的 mongo shell 中那样创建“光标”对象。在代码库的问题中几乎引用了。但是,除非在构建中集成 V8 并与基本构建(或抽象库)进行更紧密的构建集成,否则 RoboMongo 不太可能在这方面取得进展。 RoboMongo 聚合输出卡为数组。
  • 有趣。我发现我的mongo-hacker shell 扩展获得了与 OP 中提到的相同的 {result,ok} 输出,但是获得更好的输出就像在 db.runCommand() 的选项中发送 { cursor: {} } 一样简单,然后用 new DBCommandCursor(this._mongo, res); 实例化光标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2015-06-27
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多