sql >> Database teknologi >  >> NoSQL >> MongoDB

Fortryd Slap af samlet i mongodb

Nå, du kan selvfølgelig bare bruge $push og $first i en $group for at få dokumentet tilbage til, hvad det var:

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

Men du skulle nok lige have brugt $filter med MongoDB 3.2 i første omgang:

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

Og hvis du havde mindst MongoDB 2.6, kunne du stadig have brugt $map og $setDifference i stedet:

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

Det er helt fint, når hvert array-element allerede har en "unik" identifikator, så "set"-operationen fjerner bare false værdier fra $map .

Begge disse er måder at "filtrere" indhold fra et array uden faktisk at bruge $unwind

NB :Ikke sikker på, om du virkelig forstår det $in bruges til at matche en "liste over betingelser" snarere end at være forpligtet til at matche på arrays. Så generelt kan tilstanden bare være:

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

Hvor du faktisk kun har en enkelt værdi at matche på. Du bruger $in og $or når du har en "liste" over betingelser. Arrays i sig selv gør ingen forskel for den krævede operatør.




  1. Mongodb samlet sortering og begrænsning inden for gruppen

  2. Fejl under indlæsning af delte biblioteker, kan ikke åbne delt objektfil:Ingen sådan fil eller mappe (hiredis)

  3. Funktion til at bytte værdier i NodeJS m/ mongo+mongoose

  4. Hvordan bruger man variabel mongoose-forespørgsel?