Có, nó là có thể. Chỉ cần thêm một $group
giai đoạn với _id
bằng null
. Điều đó sẽ tính toán các giá trị tích lũy cho tất cả các tài liệu đầu vào nói chung. Ví dụ:
{ $group: { _id: null, total: { $sum: "$price" }}}
Hoặc nếu bạn chỉ muốn nhận một tài liệu từ các kết quả tổng hợp, bạn có thể sử dụng $limit
:
{ $limit: 1 }
CẬP NHẬT:Cả hai giải pháp này đều trả về con trỏ mà sẽ có một tài liệu duy nhất. Nhưng đừng nghĩ về findOne
như một cái gì đó đặc biệt. Nó cũng truy xuất con trỏ và chỉ lấy tài liệu đầu tiên (nếu có). Đây là triển khai trình bao mongo của findOne
:
function ( query , fields, options ){
var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/,
0 /* batchSize */, options);
if ( ! cursor.hasNext() )
return null;
var ret = cursor.next();
if ( cursor.hasNext() ) throw "findOne has more than 1 result!";
if ( ret.$err )
throw "error " + tojson( ret );
return ret;
}
Như bạn có thể thấy, nó sử dụng nội bộ find
. Vì vậy, nếu bạn muốn nhận một tài liệu thay vì con trỏ với một tài liệu, bạn có thể viết hàm của riêng mình, chức năng này hoạt động tương tự với aggregate
. Ví dụ:
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Cách sử dụng:
> db.collection.aggregateOne(...)