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

Meteorサーバー側でmongoグループを実行する方法

    Meteor v1.0.4以降:

    したがって、collection.rawCollection()を呼び出すことができます 基になるコレクションオブジェクトを取得するには:

    var rawCollection = Orders.rawCollection();
    

    このrawCollection メソッドgroupがあります これはgroupと同等です MongoDBシェルのメソッド。ただし、基盤となるノードAPIは非同期であるため、何らかの方法で同期関数に変換する必要があります。 Meteor.wrapAsyncは使用できません groupから直接 プライマリコールバックではない関数の引数を取るので、ラッパーを使用してこれを回避します:

    function ordersGroup(/* arguments */) {
        var args = _.toArray(arguments);
        return Meteor.wrapAsync(function (callback) {
            rawCollection.group.apply(rawCollection, args.concat([callback]));
        })();
    }
    

    メソッド内で、ordersGroupを呼び出すことができます db.orders.groupのように Mongoシェルで。ただし、引数はオブジェクトではなく、個別に渡されます。

    ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
    

    詳細については、このドキュメント を参照してください。 (ただし、callback 非同期ラッピングで処理されるため、パラメータは省略してください。

    したがって、それらを個別に渡す必要があります:

    var result = ordersGroup(
        // keys
        function(doc) {
            return { year: doc.createdAt.toISOString().substring(0, 4) };
        },
    
        // condition
        {createdAt: {$lt: new Date("2015-12-31"), $gt: new Date("2015-01-01")}},
    
        // initial
        {months: {}},
    
        // reduce
        function(order, result) {
            var month = order.createdAt.getMonth()+1,
                date = order.createdAt.getDate();
    
            month = result.months[month] || (result.months[month] = {});
            date = month[date] || (month[date] = []);
            date.push(order);
        }
    );
    

    もちろん、これはサーバー上でのみ機能するため、メソッドがサーバーのみのコード(できればserver内)にあることを確認してください サブディレクトリ、またはif (Meteor.isServer)内 。




    1. MongoDBグループとidをキーとして合計

    2. SpringBootアプリからmongodbにアクセスする際の認証エラー

    3. $ lte$gteを使用した$fitlerネストされた配列

    4. クエリアノテーションを使用してMongoRepositoryのアイテムを削除するにはどうすればよいですか?