【问题标题】:How to aggregate on huge array in mongoDB?如何在 mongoDB 中聚合巨大的数组?
【发布时间】:2014-09-27 08:00:10
【问题描述】:

我有一个大约 400gb 的 mongodb。文档包含各种字段,但这里的关键是一个 ID 数组。

所以一个 json 文件可能看起来像这样

{
 "name":"bob"
 "dob":"1/1/2011"
 "key":
      [  
       "1020123123",
       "1234123222",
       "5021297723"
      ]
}

这里的焦点变量是“key”。 5000 万个文档中总共有大约 100 亿个键(因此每个文档有大约 200 个键)。键可以重复,大约有 1500 万个 UNIQUE 键。

我想做的是返回 10,000 个最常用的键。我认为聚合可能会这样做,但我在让它运行时遇到了很多麻烦。这是我的代码:

db.users.aggregate( 
 [ 
  { $unwind : "$key" }, 
  { $group : { _id : "$key", number : { $sum : 1 } } },
  { $sort : { number : -1 } }, 
  { $limit : 10000 }
 ] 
);

任何想法我做错了什么?

【问题讨论】:

  • 你遇到了什么问题,你的MongoDB是什么版本的?
  • 我正在运行 2.6.4。我得到的错误是 Exceeded memory limit for $group,

标签: mongodb


【解决方案1】:

试试这个:

db.users.aggregate( 
 [ 
  { $unwind : "$key" }, 
  { $group : { _id : "$key", number : { $sum : 1 } } },
  { $sort : { number : -1 } }, 
  { $limit : 10000 },
  { $out:"result"},
 ], {
  allowDiskUse:true,
  cursor:{}
 }
);

然后通过db.result.find()查找结果。

【讨论】:

  • 我试过这个但得到这个错误:“异常:超过 $group 的内存限制,但不允许外部排序。通过 allowDiskUse:true 来选择加入。”这很奇怪,因为我假设我确实选择使用您的代码的第二部分。嗯
  • @AlexKogan,这真的很奇怪。你能把你的代码贴在这里吗?
  • 来了! db.users.aggregate( [ { $unwind : "$likes" }, { $group : { _id : "$likes", number : { $sum : 1 } } }, { $sort : { number : -1 } }, { $limit : 10000 }, { $out:"result"}, ], { allowDiskUse:true, cursor:{} })
  • @AlexKogan,即使] 之前有多余的逗号,,代码也绝对正确。收到该异常消息很奇怪,因为您提供了allowDiskUse:true。我能想到的所有可能性都是您使用较低版本的mongo shell(例如V2.4.8)来连接V2.6.4的服务器。但是您声称您正在运行 V2.6.4。那么,这是一个错误吗? :)
  • 很奇怪!为此,我正在使用 robomongo 连接到我的远程服务器。我检查了 mongodb 的版本及其 2.6.4。除非 robomongo 本身很旧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2014-11-08
相关资源
最近更新 更多