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

undoUnwindをmongodbでまとめて

    もちろん、 $ pushを使用することもできます。 および $ first $ group ドキュメントを元の状態に戻すには:

    db.getCollection('matchWiseData').aggregate([
        { "$match":{
           "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
        }},
        { "$unwind":"$matchData"},
        { "$match":{
            "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
        }},
        { "$group": {
            "_id": "$_id",
            "venueId": { "$first": "$venueId" },
            "companyId": { "$first": "$companyId" },
            "cardTypeId": { "$first": "$cardTypeId" },
            "matchData": { "$push": "$matchData" }
        }}
    ])
    

    ただし、おそらく $ filterを使用する必要があります。 そもそもMongoDB3.2で:

    db.getCollection('matchWiseData').aggregate([
        { "$match":{
           "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
        }},
        { "$project": {
            "venueId": 1,
            "companyId": 1,
            "cardTypeId": 1,
            "matchData": { 
                "$filter": {
                    "input": "$matchData",
                    "as": "match",
                    "cond": {
                       "$or": [
                           { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                       ]
                    }
                }
            }
        }}
    ])
    

    また、少なくともMongoDB 2.6を使用している場合でも、 $ map および $ setDifference 代わりに:

    db.getCollection('matchWiseData').aggregate([
        { "$match":{
           "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
        }},
        { "$project": {
            "venueId": 1,
            "companyId": 1,
            "cardTypeId": 1,
            "matchData": { 
                "$setDifference": [
                    { "$map": {
                        "input": "$matchData",
                        "as": "match",
                        "in": {
                            "$cond": [
                               { "$or": [
                                  { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                               ]},
                                "$$match",
                                false
                            ]
                        }
                    }},
                    [false]
                ]
            }
        }}
    ])
    

    すべての配列要素がすでに「一意の」識別子を持っている場合、これはまったく問題ありません。したがって、「設定」操作は falseを削除するだけです。 $ mapの値 。

    を実際に使用せずに、配列からコンテンツを「フィルタリング」する方法はどちらも $ unwind

    N.B $ in> 「条件のリスト」と照合するために使用されます 配列で一致する必要はありません。したがって、一般的に条件は次のようになります。

     "matchData.matchId": ObjectId("57175c25561d87001e666d12")
    

    実際に一致する値が1つしかない場合。 $ inを使用します および$または 条件の「リスト」がある場合。配列自体は、必要な演算子に違いはありません。




    1. MongoDBの既存のフィールドの最後に文字列を追加します

    2. Meteor / ReactJS-UIの点滅の問題:データベースをチェックする前後に2回レンダリングする

    3. 一度実行された(そしてロードされなかった)Meteorアプリのデータベースが3GB近くを占めるのはなぜですか?

    4. SQLで数値をフォーマットする方法