Имам колекция звена (схема по-долу) с почти 500 000 записа.
{
url,
title,
owner,
stars: { users: [{ name }]},
createdAt
}
и наистина не разбирам защо простата агрегационна проекция
var projection = { $project: { _id: 1, url: 1, title: 1, createdAt: 1 } }
Link.aggregate([projection]).exec(resultCallback);
повдига един
MongoError: exception: aggregation result exceeds maximum document size (16MB)
можеш ли да ми обясниш?
Използвам Mongoose (3.8.8) и Mongodb (2.6.0)
Отговори:
1 за отговор № 1Не съм сигурен дали опциите, налични от MongoDB 2.6 и вградените, са напълно достъпни в .aggregate()
прилагане на метод в мангуста. Но трябва да има опции "хеш / обект", налични след аргумента на тръбопровода. Така че основно:
var pipeline = [{ $project: { _id: 1, url: 1, title: 1, createdAt: 1 } }];
Link.aggregate(pipeline,{ cursor: true}, function(err,cursor) {
});
Или ако mongoose не харесва това по някаква причина, просто вземете суровата колекция от драйвери на възел:
var pipeline = [{ $project: { _id: 1, url: 1, title: 1, createdAt: 1 } }];
Link.collection.aggregate(pipeline,{ cursor: true}, function(err,cursor) {
if (err)
throw err;
// Do something with the cursor which is actually more akin to a node
// stream interface with a basic .next() method and other helpers.
});
В противен случай, тъй като изходът ви взривява ограничението от 16 MB BSON, винаги можете да изведете в колекция:
var pipeline = [
{ $project: { _id: 1, url: 1, title: 1, createdAt: 1 } },
{ $out: "newcollection" }
];
Но тъй като вероятно просто наистина тествате, защо просто не използвате $limit
етап на тръбопровод, докато не изработите останалата част от своето обобщение:
var pipeline = [
{ $project: { _id: 1, url: 1, title: 1, createdAt: 1 } },
{ $limit: 50 }
];
Така че има няколко различни начина за справяне с нещата.