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

Meteor và DBRefs

Chơi xung quanh với Cursor.observe đã trả lời câu hỏi của tôi. Đó có thể không phải là cách hiệu quả nhất để thực hiện việc này, nhưng giải quyết được các vấn đề trong tương lai của tôi về việc bỏ tham khảo "liên kết" DBRefs

Vì vậy, đối với máy chủ, chúng tôi cần xuất bản một bộ sưu tập đặc biệt. Một có thể liệt kê con trỏ và cho mỗi tìm kiếm tài liệu cho DBRef tương ứng. Hãy lưu ý rằng việc triển khai này được mã hóa cứng và nên được thực hiện dưới dạng một gói như UnRefCollection.

Phía máy chủ

    CC.Logs = new Meteor.Collection("logs");
    CC.Users = new Meteor.Collection("users");

Meteor.publish('logsAndUsers', function (page, size) {
    var self = this;
    var startup = true;  
    var startupList = [], uniqArr = [];

    page = page || 1;
    size = size || 100;
    var skip = (page - 1) * size;

    var cursor = CC.Logs.find({}, {limit : size, skip : skip});
    var handle = cursor.observe({
        added : function(doc, idx){
            var clone = _.clone(doc);
            var refId = clone.user_id.oid; // showld search DBRefs
            if (startup){
                startupList.push(clone);    
                if (!_.contains(uniqArr, refId))
                    uniqArr.push(refId);
            } else {
                // Clients added logs
                var deref = CC.Users.findOne({_id : refid});
                clone.user = deref;
                self.set('logsAndUsers', clone._id, clone);
                self.flush();
            }
        },
        removed : function(doc, idx){
            self.unset('logsAndUsers', doc._id, _.keys(doc));
            self.flush();
        },
        changed : function(new_document, idx, old_document){
            var set = {};
            _.each(new_document, function (v, k) {
              if (!_.isEqual(v, old_document[k]))
                set[k] = v;
            });
            self.set('logsAndUsers', new_document._id, set);
            var dead_keys = _.difference(_.keys(old_document), _.keys(new_document));
            self.unset('logsAndUsers', new_document._id, dead_keys);
            self.flush();
        },
        moved : function(document, old_index, new_index){
            // Not used
        }
    });

    self.onStop(function(){
        handle.stop();
    });

    //  Deref on first Run
    var derefs = CC.Users.find({_id : {$in : uniqArr} }).fetch();
    _.forEach(startupList, function (item){
        _.forEach(derefs, function(ditems){
            if (item["user_id"].oid === ditems._id){
                item.user = ditems;
                return false;
            }
        });
        self.set('logsAndUsers', item._id, item);
    });
    delete derefs; // Not needed anymore

    startup = false;
    self.complete();
    self.flush();
});

Đối với mỗi tài liệu nhật ký được thêm vào, nó sẽ tìm kiếm trong bộ sưu tập người dùng và cố gắng thêm vào bộ sưu tập nhật ký thông tin còn thiếu. id như vậy trong lần chạy đầu tiên, nó sẽ truy vấn db chỉ một lần. Bạn nên đặt một cơ chế phân trang để tăng tốc mọi thứ.

Phía khách hàng

Trên máy khách, đăng ký bộ sưu tập logAndUsers, nếu bạn muốn thực hiện thay đổi, hãy thực hiện điều đó trực tiếp với bộ sưu tập Nhật ký.

LogsAndUsers = new Meteor.collection('logsAndUser');
Logs = new Meteor.colection('logs'); // Changes here are observed in the LogsAndUsers collection

Meteor.autosubscribe(function () {
    var page = Session.get('page') || 1;
    Meteor.subscribe('logsAndUsers', page);
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lấy _id của tài liệu được chèn trong cơ sở dữ liệu Mongo trong NodeJS

  2. Mongoose.js:Tìm người dùng theo tên người dùng Giá trị LIKE

  3. Quản lý MySQL, MongoDB &PostgreSQL với ChatOps từ Slack

  4. Sử dụng trình tạo Active Record sau khi cài đặt Mongoid?

  5. MongoDB sort ()