MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Có thể nhận được kết quả duy nhất trong tổng hợp không?

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 :

Hàm
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(...)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chuẩn bị máy chủ MongoDB để sản xuất

  2. Lấy HTML từ MongoDB để sử dụng trong Mẫu

  3. Sử dụng findOne in a loop mất quá nhiều thời gian trong Node.js

  4. Cách chính xác để lập chỉ mục trong MongoDB là gì khi tồn tại sự kết hợp lớn của các trường

  5. Cập nhật tài liệu con chứa trong một mảng có trong tài liệu MongoDB