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

Meteorの平均集計クエリ

    Meteor 0.6.5の時点では、コレクションAPIは集計クエリをまだサポートしていません。これは、集計クエリに対してライブ更新を行う(簡単な)方法がないためです。ただし、自分で作成して、Meteor.publishで利用できるようにすることはできます。 、結果は静的になりますが。私の意見では、複数の集計をマージしてクライアント側のコレクションAPIを使用できるため、この方法で行うことをお勧めします。

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

    上記は、グループ化/カウントの集計の例です。注意事項:

    • これを行うと、当然、server_collection_nameで集計が行われます。 結果をclient_collection_nameという別のコレクションにプッシュします 。
    • このサブスクリプションは公開されず、引数が変更されるたびに更新される可能性があるため、すべての結果をプッシュするだけの非常に単純なループを使用します。
    • 集計の結果にはMongoObjectIDが含まれていないため、独自の任意のIDを生成します。
    • アグリゲーションへのコールバックはファイバーでラップする必要があります。 Meteor.bindEnvironmentを使用しています ここでは、Futureを使用することもできます より低レベルの制御のために。

    このようなパブリケーションの結果を組み合わせる場合は、ランダムに生成されたIDがマージボックスにどのように影響するかを慎重に検討する必要があります。ただし、これの簡単な実装は、Meteor APIをクライアント側で使用する方が便利なことを除けば、単なる標準のデータベースクエリです。

    TL;DRバージョン :サーバーからデータをプッシュするほとんどの場合、publish methodよりも望ましい 。

    集計を行うさまざまな方法の詳細については、この投稿を確認してください



    1. mongorestoreは、個別の引数ではなく、単一のurl引数を取ることができますか?

    2. mongorestoreを使用してMongoDBデータベースを復元する

    3. EVAL、SCAN、およびDELを使用したRedisワイルドカード削除スクリプトは、非決定論的コマンドの後に許可されていない書き込みコマンドを返します

    4. キースペースイベントを再起動しません-起動しません