MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Annuler Déroulez dans l'ensemble dans mongodb

Eh bien, vous pouvez bien sûr simplement utiliser $push et $first dans un $group pour redonner au document ce qu'il était :

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

Mais vous auriez probablement dû utiliser $filter avec MongoDB 3.2 en premier lieu :

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

Et si vous aviez au moins MongoDB 2.6, vous auriez toujours pu utiliser $map et $setDifference à la place :

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

C'est parfaitement bien lorsque chaque élément du tableau a déjà un identifiant "unique", donc l'opération "set" supprime simplement le false valeurs de $map .

Ces deux moyens de "filtrer" le contenu d'un tableau sans réellement utiliser $unwind

N.B :Je ne sais pas si vous comprenez vraiment que $in est utilisé pour correspondre à une "liste de conditions" plutôt que d'être obligé de faire correspondre les tableaux. Donc, généralement, la condition peut simplement être :

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

Où vous n'avez en fait qu'une seule valeur à faire correspondre. Vous utilisez $in et $or quand vous avez une "liste" de conditions. Les tableaux eux-mêmes ne font aucune différence pour l'opérateur requis.