2017-02-08 4 views
1

Я просканировал все переполнения стека и не нашел никакой информации о том, как вернуть правильные данные разбивки на страницы, включенные в набор результатов.Mongo aggregation с разбитыми на страницы данными и итоговыми значениями

Я пытаюсь объединить некоторые данные из моего магазина mongo. То, что я хочу, чтобы иметь что-то возвращение:

{ 
    total: 5320, 
    page: 0, 
    pageSize: 10, 
    data: [ 
    { 
     _id: 234, 
     currentEvent: "UPSTREAM_QUEUE", 
     events: [ 
     { ... }, { ... }, { ... } 
     ] 
    }, 
    { 
     _id: 235, 
     currentEvent: "UPSTREAM_QUEUE", 
     events: [ 
     { ... }, { ... }, { ... } 
     ] 
    } 
    ] 
} 

Это то, что я до сих пор:

// page and pageSize are variables 
db.mongoAuditEvent.aggregate([ 
    // Actual grouped data 
    {"$group": { 
    "_id" : "$corrId", 
    "currentEvent": {"$last": "$event.status"}, 
    "events": { $push: "$$ROOT"} 
    }}, 
    // Pagination group 
    {"$group": { 
    "_id": 0, 
    "total": { "$sum": "corrId" }, 
    "page": page, 
    "pageSize": pageSize, 
    "data": { 
     "$push": { 
     "_id": "$_id", 
     "currentEvent": "$currentEvent", 
     "events": "$events" 
     } 
    } 
    }}, 
    {"$sort": {"events.timestamp": -1} }, // Latest first 
    {"$skip": page }, 
    {"$limit": pageSize } 
], {allowDiskUse: true}); 

Я пытаюсь иметь постраничной группу в качестве корня, содержащий фактические данные, сгруппированные внутри (так что я получаю фактические итоговые значения, сохраняя при этом skip и limits).

Приведенный выше код возвращает следующую ошибку в Монго консоли: The field 'page' must be an accumulator object

Если я удалить page и pageSize из группы постраничной, я все еще получаю следующее сообщение об ошибке: BSONObj size: 45707184 (0x2B96FB0) is invalid. Size must be between 0 and 16793600(16MB) First element: id: 0

Если я удалить группа разбиения на страницы alltogether, запрос работает нормально. Но мне действительно нужно вернуть количество документов, которые я сохранил total, и, хотя на самом деле не нужно, page и pageSize было бы неплохо вернуться.

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Или скажите мне, возможно ли это сделать за один раз?

+0

Что вы имеете в виду * ему не будет работать*? Ошибка? Неожиданные результаты? Какая часть запроса выходит из строя? –

+0

Добавлено сообщение об ошибке как edit above –

ответ

3

Если у вас есть много событий, {$ толчок: «$$ ROOT»}, сделает Монго возвращает ошибку, я решил его с $ фаской

aggregate([ 
    { $match: options }, 
    { 
     $facet: { 
     edges: [ 
      { $sort: sort }, 
      { $skip: skip }, 
      { $limit: limit }, 
     ], 
     pageInfo: [ 
      { $group: { _id: null, count: { $sum: 1 } } }, 
     ], 
     }, 
    }, 
    ]) 
+1

Большое спасибо за ваше решение. Это действительно помогает мне. – ilyapt

1

ли это в два этапа вместо одного:

// Get the totals 
db.mongoAuditEvent.aggregate([{$group: {_id: "$corrId"}}, {$group: {_id: 1, total: {$sum: 1}}}]); 

// Get the data 
db.mongoAuditEvent.aggregate([ 
    {$group: { 
    _id : "$corrId", 
    currentEvent: {"$last": "$event.status"}, 
    "events": { $push: "$$ROOT"} 
    }}, 
    {$sort: {"events.timestamp": -1} }, // Latest first 
    {$skip: 0 }, 
    {$limit: 10} 
], {allowDiskUse: true}).pretty(); 

Я был бы очень рад, если бы кто-нибудь получил лучшее решение этого, хотя.

+0

Разве это не пробило 2.4 mongo? https://docs.mongodb.com/manual/reference/operator/aggregation/limit/ – Petrogad

Смежные вопросы