sql >> データベース >  >> NoSQL >> MongoDB

MeteorとDBRefs

    Cursor.observeで遊んで、私の質問に答えました。これを行うのに最も効果的な方法ではないかもしれませんが、DBRefの「リンク」を参照解除するという将来の問題は解決します

    したがって、サーバーの場合、特別なコレクションを公開する必要があります。カーソルを列挙し、ドキュメントごとに対応するDBRefを検索できるもの。この実装はハードコーディングされているため、UnRefCollectionのようなパッケージとして実行する必要があることに注意してください。

    サーバー側

        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();
    });
    

    追加されたログドキュメントごとに、ユーザーコレクションを検索し、不足している情報をログコレクションに追加しようとします。追加された関数は、最初の実行でログコレクション内のドキュメントごとに呼び出されます。startupListと一意のユーザーの配列を作成しました。 idsなので、最初の実行では、dbに1回だけクエリを実行します。物事をスピードアップするためにページングメカニズムを配置することをお勧めします。

    クライアント側

    クライアントで、logsAndUsersコレクションをサブスクライブします。変更を加える場合は、Logsコレクションに直接サブスクライブします。

    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サーバーでのSpringセッションの設定

    2. mongodbの利点はスキーマがないことであると想定されているのに、なぜmongooseはスキーマを使用するのですか?

    3. mongodbでクエリに参加する方法は?

    4. Redis 6はマルチコアCPUを利用できますか?