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

各グループの最後の真の値を返します

    これを行う最良の方法は、集約フレームワークを使用することです。 $groupする必要があります 「user」でドキュメントを返し、$lastを使用して各ユーザーの最後のドキュメントを返します アキュムレータ演算子ですが、これを機能させるには、$sortを使用した予備的な並べ替え段階が必要です。 集約パイプライン演算子。ドキュメントを並べ替えるには、「createdAt」フィールドと「user」フィールドの両方を考慮する必要があります。

    パイプラインの最後の段階は$matchです 「isAbandoned」がtrueに等しい最後のドキュメントのみを選択するステージ 。

    db.students.aggregate([
        { "$sort": { "user": 1, "createdAt": 1 } }, 
        { "$group": { 
            "_id": "$user", 
            "last": { "$last": "$$ROOT" }
        }}, 
        { "$match": { "last.isAbandoned": true } }
    ])
    

    これは次のようなものを返します:

    { 
        "_id" : ObjectId("56c85244bd5f92cd78ae4bc1"),
        "last" : {
            "_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
            "user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
            "studentName" : "Rajeev",
            "createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
            "isAbandoned" : true
        }
    }
    

    期待どおりの結果を得るには、$replaceRootを使用する必要があります 埋め込まれたドキュメントをトップレベルにプロモートするためのバージョン3.4から始まるパイプラインオペレーター

    {
        $replaceRoot: { newRoot: "$last" }
    }
    

    古いバージョンでは、$projectを使用する必要があります ドキュメントを再形成するための集約パイプライン操作。したがって、パイプラインを次の段階で拡張すると、次のようになります。

    { 
        "$project": { 
            "_id": "$last._id", 
            "user": "$last.user", 
            "studentName": "$last.studentName", 
            "createdAt": "$last.createdAt", 
            "isAbandoned": "$last.isAbandoned"
    }}
    

    期待される出力を生成します:

    {
        "_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
        "user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
        "studentName" : "Rajeev",
        "createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
        "isAbandoned" : true
    }
    


    1. Hadoop Map/Reduceと組み込みのMap/Reduce

    2. スキーマがマングース配列にデフォルト値を追加しないのはなぜですか?

    3. MongoDB、配列からオブジェクトを削除します

    4. マングースの重みによる全文検索