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

Các truy vấn tổng hợp trung bình trong Meteor

Kể từ Meteor 0.6.5, API thu thập chưa hỗ trợ các truy vấn tổng hợp vì không có cách (đơn giản) nào để cập nhật trực tiếp chúng. Tuy nhiên, bạn vẫn có thể tự viết chúng và cung cấp chúng trong Meteor.publish , mặc dù kết quả sẽ là tĩnh. Theo ý kiến ​​của tôi, làm theo cách này vẫn thích hợp hơn vì bạn có thể hợp nhất nhiều tập hợp và sử dụng API thu thập phía máy khách.

Meteor.publish("someAggregation", function (args) {
    var sub = this;
    // This works for Meteor 0.6.5
    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    // Your arguments to Mongo's aggregation. Make these however you want.
    var pipeline = [
        { $match: doSomethingWith(args) },
        { $group: {
            _id: whatWeAreGroupingWith(args),
            count: { $sum: 1 }
        }}
    ];

    db.collection("server_collection_name").aggregate(        
        pipeline,
        // Need to wrap the callback so it gets called in a Fiber.
        Meteor.bindEnvironment(
            function(err, result) {
                // Add each of the results to the subscription.
                _.each(result, function(e) {
                    // Generate a random disposable id for aggregated documents
                    sub.added("client_collection_name", Random.id(), {
                        key: e._id.somethingOfInterest,                        
                        count: e.count
                    });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );
});

Trên đây là một ví dụ về tổng hợp nhóm / số lượng. Một số điều cần lưu ý:

  • Khi bạn làm điều này, tự nhiên bạn sẽ thực hiện tổng hợp trên server_collection_name và đẩy kết quả vào một bộ sưu tập khác được gọi là client_collection_name .
  • Đăng ký này sẽ không hoạt động và có thể sẽ được cập nhật bất cứ khi nào các đối số thay đổi, vì vậy, chúng tôi sử dụng một vòng lặp thực sự đơn giản chỉ đẩy tất cả kết quả ra ngoài.
  • Kết quả tổng hợp không có Mongo ObjectID, vì vậy, chúng tôi tạo một số ID tùy ý của riêng mình.
  • Việc gọi lại tập hợp cần được bao bọc trong một Sợi. Tôi sử dụng Meteor.bindEnvironment ở đây nhưng người ta cũng có thể sử dụng Future để kiểm soát mức độ thấp hơn.

Nếu bạn bắt đầu kết hợp các kết quả của các ấn phẩm như thế này, bạn sẽ cần phải xem xét cẩn thận cách các id được tạo ngẫu nhiên tác động đến hộp hợp nhất. Tuy nhiên, việc triển khai đơn giản đây chỉ là một truy vấn cơ sở dữ liệu tiêu chuẩn, ngoại trừ việc sử dụng với phía máy khách Meteor APIs sẽ thuận tiện hơn.

Phiên bản TL; DR :Hầu như bất cứ lúc nào bạn đẩy dữ liệu ra khỏi máy chủ, hãy publish thích hợp hơn phương thức method .

Để biết thêm thông tin về các cách khác nhau để tổng hợp, hãy xem bài đăng này .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Di chuyển MongoDB sang DynamoDB, Phần 2

  2. MongoDB Schema Design - Nhiều tài liệu nhỏ hay ít tài liệu lớn hơn?

  3. Chỉ nhận một trường được chỉ định trong MongoDB với C #

  4. Cách giám sát MongoDB với Prometheus &ClusterControl

  5. Tại sao Mongodb hoạt động tốt hơn trên Linux so với Windows?