我确实有一个表格超过十亿个对象的表:
{
"_id" : ObjectId("5893ae4f7a5449caebba5848"),
"id" : NumberLong(1234567890),
"inserted_at" : ISODate("2017-02-02T22:10:23.812Z")
}
它保存在mongodb 3.2.11。
上我每周插入近5000万个新记录,需要将新周的记录与上周的记录进行比较。
因此,我已经建立了这样的查询:
db.getCollection('table').aggregate(
[
{"$group" : {
"_id": {
"year": { "$year": "$inserted_at"},
"week": { "$week": "$inserted_at"}},
"Content_IDs": { "$push": "$id"}}},
{ "$sort": {'_id.year': -1, '_id.week': -1}},
{ "$limit": 2},
{ "$group": {
"_id": null,
"Last": { $first: "$Content_IDs" },
"Previous": { $last: "$Content_IDs"}
}},
{ $project: {
"Outgoing": { $setDifference: [ "$Previous", "$Last" ] },
"Incoming": { $setDifference: [ "$Last", "$Previous" ] }}},
],
{allowDiskUse:true}
)
但是,由于数据的大小,MongoDB无法计算结果。
错误如下:
断言:命令失败:{" ok":0," errmsg":" bufbuilder尝试 要生长()到134217728字节,超过64MB限制。","代码":13548}
我试图将所有记录获取到Python Env中,以便我可以在此计算结果,但是当我在pymongo.Aggregate上运行以下管道时,我遇到了相同的错误:
[
{"$group" : {
"_id": {
"year": { "$year": "$inserted_at"},
"week": { "$week": "$inserted_at"}},
"Content_IDs": { "$push": "$id"}}},
{ "$sort": SON([('_id.year', -1), ('_id.week', -1)])},
{ "$limit": 2}
]
它在较小的数据规模上起作用。如何使此查询更加可扩展?有什么建议吗?
非常感谢!
我面临类似的问题,我开始使用Spark(和Scala)来操纵我的数据。没有太多的内存限制,您可以在集群中使用,并且比Nodejs更快。