В mongodb, имея коллекцию с sessionId
с и label
с, я бы хотел сгруппировать по идентификатору сессии, где метка равна 'view_item' и завершено sh:
- Получить количество групп sessionId.
- Возможность потоковой передачи каждого sessionId потребителю (при условии, что у меня ограниченные ресурсы памяти и большое количество отдельных
sessionId
s)
Предположим, что в коллекции есть следующие документы:
{ "label" : "view_item", "sessionId" : "01e5dnnpsczgfq58rmp0cjtjm0" }
{ "label" : "view_category", "sessionId" : "01e5dnnpsczgfq58rmp0cjtjm0" }
{ "label" : "view_item", "sessionId" : "01e5dnnpsczgfq58rmp0cjtjm0" }
{ "label" : "view_item", "sessionId" : "01e5g7vzx5dh0mv8m6g1zbdrnj" }
{ "label" : "view_item", "sessionId" : "01e5g7vzx5dh0mv8m6g1zbdrnj" }
{ "label" : "view_category", "sessionId" : "01e5g7vzx5dh0mv8m6g1zbdrnj" }
{ "label" : "view_item", "sessionId" : "01e5g7vzx5dh0mv8m6g1zbdrnj" }
Ожидаемый результат будет примерно таким:
Получите results
как-то и ...
result.count() // 2 (or some other way of getting the count)
await result.next() // { sessionId: '01e5dnnpsczgfq58rmp0cjtjm0' }
await result.next() // { sessionId: '01e5g7vzx5dh0mv8m6g1zbdrnj' }
await result.next() // null
Я возился со структурой агрегации и умею группировать и считать. Теоретически я мог бы сделать два запроса сначала для подсчета, а затем для групп, но в сценарии частой записи я обеспокоен тем, что выполнение двух отдельных запросов может привести к несоответствиям, тем более что я не понял, как включить какой-либо запуск / конечные идентификаторы в результате запроса подсчета, которые можно использовать для ограничения результатов запроса групп.
На данный момент у меня есть:
const result = collection.aggregate([
{ $match: { label: 'view_item' } },
{ $group : { _id: { sessionId: '$sessionId' } } },
]);
await result.next() // { _id: { sessionId: '01e5g7vzx5dh0mv8m6g1zbdrnj' } }
await result.next() // { _id: { sessionId: '01e5dnnpsczgfq58rmp0cjtjm0' } }
await result.next() // null
и
const result = collection.aggregate([
{ $match: { label: 'view_item' } },
{ $group : { _id: { sessionId: '$sessionId' } } },
{ $facet: { count: [{ $count: 'count' }] } }
]);
await result.next() // { count: [ { count: 2 } ] }
await result.next() // null
Вопрос
Как два вышеупомянутых запроса можно объединить, чтобы надежно получить счетчик и результат с сгруппированным sessionId, который может быть передан в поток? (Я предполагаю, что любое решение, основанное на result.toArray().length
, должно загружать весь результат в память, что исключено).
Возможно ли выполнить в одном запросе или с большей вероятностью получить счетчик и запустить / конечные идентификаторы в одном запросе, а затем второй запрос, чтобы получить группы, ограниченные начальным / конечным идентификаторами?
Спасибо!