MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Unwind insgesamt in Mongodb rückgängig machen

Nun, Sie können natürlich einfach $push verwenden und $first in einem $group um das Dokument wieder so zu machen, wie es war:

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" }
    }}
])

Aber Sie hätten wahrscheinlich einfach $filter verwenden sollen mit MongoDB 3.2 an erster Stelle:

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") ] }
                   ]
                }
            }
        }
    }}
])

Und wenn Sie mindestens MongoDB 2.6 hätten, hätten Sie immer noch $map und $setDifference stattdessen:

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

Das ist völlig in Ordnung, wenn jedes Array-Element bereits einen „eindeutigen“ Bezeichner hat, sodass die „set“-Operation nur den false entfernt Werte aus $map .

Beides sind Möglichkeiten, Inhalte aus einem Array zu „filtern“, ohne tatsächlich zu verwenden $unwind

NB :Nicht sicher, ob Sie diesen $in wird verwendet, um eine "Liste von Bedingungen" abzugleichen anstatt auf Arrays übereinstimmen zu müssen. Im Allgemeinen kann die Bedingung also einfach lauten:

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

Wo Sie eigentlich nur einen einzigen Wert zum Abgleichen haben. Sie verwenden $in und $oder wenn Sie eine "Liste" von Bedingungen haben. Arrays selbst machen für den erforderlichen Operator keinen Unterschied.