2015-11-26 3 views
7

Я хочу получить общее количество записей в агрегированном курсоре в версии pymongo версии 3.0+. Есть ли способ получить общий счет без повторения курсора?Как подсчитать курсор агрегации pymongo без итерации

cursor = db.collection.aggregate([{"$match": options},{"$group": {"_id": groupby,"count": {"$sum":1}}} ]) 
cursorlist = [c for c in cursor] 
print len(cursorlist) 

Есть ли способ пропустить вышеупомянутую итерацию?

+1

В приведенном выше коде len (list (cursor)) вы получите количество возвращенных записей. 2-я строка не нужна поэтому. –

+0

Спасибо @Sarath это будет полезно, если я не хочу обновлять свой запрос агрегирования. – jadhavmahendra7

ответ

4

Вы можете добавить еще один групповой конвейер, в котором вы указываете значение _idNone, чтобы вычислить накопленные значения для всех входных документов в целом, здесь вы можете получить общее количество, а также исходные сгруппированные счета, хотя в скопированном массиве:

>>> pipeline = [ 
...  {"$match": options}, 
...  {"$group": {"_id": groupby, "count": {"$sum":1}}}, 
...  {"$group": {"_id": None, "total": {"$sum": 1}, "details":{"$push":{"groupby": "$_id", "count": "$count"}}}} 
... ] 
>>> list(db.collection.aggregate(pipeline)) 
+0

Это сработало. Только незначительные изменения, Python должен использовать None и не null спасибо! – jadhavmahendra7

+0

@ jadhavmahendra7 Хорошая добыча! Я обновил свой ответ, чтобы отразить это, ура :) – chridam

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