В соответствии с mongodb node драйверами docs функция aggregate теперь возвращает курсор (от версии 2.6).
Я надеялся, что могу использовать это, чтобы получить предварительный предел количества отсчетов и пропустить, но на созданном курсоре нет функции подсчета. Если я запускаю те же запросы в оболочке mongo, курсор имеет функцию itcount, которую я могу вызвать, чтобы получить то, что я хочу.
Я видел, что созданный курсор имеет событие данных (это означает, что он CursorStream?), который, похоже, вызвал ожидаемое количество раз, но если я использую его в сочетании с cursor.get, результаты не будут переданы в функцию обратного вызова.
Можно ли использовать новую функцию курсора для подсчета запроса агрегации?
Изменить код:
В оболочке манго:
> db.SentMessages.find({Type : 'Foo'})
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19dd9834184ad6d3675c"), "Name" : "789", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19d29834184ad6d3675b"), "Name" : "456", "Type" : "Foo" }
> db.SentMessages.find({Type : 'Foo'}).count()
3
> db.SentMessages.find({Type : 'Foo'}).limit(1)
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
> db.SentMessages.find({Type : 'Foo'}).limit(1).count();
3
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ])
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19dd9834184ad6d3675c"), "Name" : "789", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19d29834184ad6d3675b"), "Name" : "456", "Type" : "Foo" }
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ]).count()
2014-08-12T14:47:12.488+0100 TypeError: Object #<Object> has no method 'count'
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ]).itcount()
3
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}}, {$limit : 1} ])
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}}, {$limit : 1} ]).itcount()
1
> exit
bye
В Node:
var cursor = collection.aggregate([ { $match : { Type : 'Foo'}}, {$limit : 1} ], { cursor : {}});
cursor.get(function(err, res){
// res is as expected (1 doc)
});
cursor.count() не существует
cursor.itcount() не существует
Событие на данных существует:
cursor.on('data', function(){
totalItems++;
});
но при использовании в сочетании с cursor.get функция обратного вызова .get теперь содержит 0 docs
Изменить 2: Возвращаемый курсор выглядит как курсор агрегации, а не один из курсоров, перечисленных в документах