У меня есть таблица с более чем миллиардом объектов, как показано ниже:
{
"_id" : ObjectId("5893ae4f7a5449caebba5848"),
"id" : NumberLong(1234567890),
"inserted_at" : ISODate("2017-02-02T22:10:23.812Z")
}
Сохранено на mongodb 3.2.11.
Каждую неделю я вставляю почти 50 миллионов новых записей, и мне нужно сравнить записи новой недели с записями предыдущей недели.
Поэтому я построил такой запрос:
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 не может вычислить результат из-за размера данных.
Ошибка следующая:
assert: команда не выполнена: { "ok" : 0, "errmsg" : "BufBuilder попытался увеличить () размер до 134217728 байт, превысив ограничение в 64 МБ.", "code" : 13548 }
Я попытался извлечь все записи в среду Python, чтобы вычислить там результат, но получил ту же ошибку при запуске следующего конвейера на 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}
]
Он работает с меньшим масштабом данных. Как сделать этот запрос более масштабируемым? Какие-либо предложения?
Огромное спасибо!