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

単一の結果を集約して取得することは可能ですか?

    はい、可能です。 $groupを追加するだけです _idを使用したステージ nullに等しい 。これにより、すべての入力ドキュメント全体の累積値が計算されます。例:

    { $group: { _id: null, total: { $sum: "$price" }}}
    

    または、集計結果から1つのドキュメントのみを取得する場合は、$limitを使用できます。 :

    { $limit: 1 }
    

    更新:これらのソリューションは両方ともカーソルを返します 単一のドキュメントがあります。ただし、findOneについては考えないでください。 特別なものとして。また、カーソルを取得し、最初のドキュメント(存在する場合)を取得します。これがfindOneのmongoシェル実装です :

    function ( query , fields, options ){
        var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/,
            0 /* batchSize */, options);
    
        if ( ! cursor.hasNext() )
            return null;
        var ret = cursor.next();
        if ( cursor.hasNext() ) throw "findOne has more than 1 result!";
        if ( ret.$err )
            throw "error " + tojson( ret );
        return ret;
    }
    

    ご覧のとおり、内部ではfindを使用しています 。したがって、単一のドキュメントでカーソルの代わりに単一のドキュメントを取得したい場合は、aggregateで同じことを行う独自の関数を作成できます。 。例:

    > DBCollection.prototype.aggregateOne = function(pipeline) {
         var cur = this.aggregate(pipeline);
         if (!cur.hasNext())
             return null; 
         return cur.next(); 
     }
    

    使用法:

    > db.collection.aggregateOne(...)
    


    1. MongoDBは、_idの配列のどこを選択しますか?

    2. MongoDB挿入パフォーマンスを改善する方法

    3. Laravel Socket.io接続されていますが、データを受信して​​いません

    4. 最先端のデータベース管理:ClusterControl-ガイド