sql >> Databasteknik >  >> NoSQL >> MongoDB

Ångra Varva ner totalt i mongodb

Jo, du kan naturligtvis bara använda $push och $first i en $group för att få dokumentet tillbaka till vad 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 borde förmodligen bara ha använt $filter med MongoDB 3.2 i första hand:

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

Och om du hade åtminstone MongoDB 2.6, kunde du fortfarande ha använt $map och $setDifference istället:

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 är helt okej när varje arrayelement redan har en "unik" identifierare, så "set"-operationen tar bara bort false värden från $map .

Båda dessa är ett sätt att "filtrera" innehåll från en array utan att faktiskt använda $unwind

Obs :Inte säker på om du verkligen förstår det $in används för att matcha en "lista med villkor" snarare än att behöva matcha på arrayer. Så generellt kan tillståndet bara vara:

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

Där du faktiskt bara har ett enda värde att matcha på. Du använder $in och $or när du har en "lista" med villkor. Arrayer i sig gör ingen skillnad för den operatör som krävs.




  1. Meteor-sidan uppdateras med knappklick

  2. nextjs importera men anropa inte funktionskast Modulen hittades inte:Fel:Kan inte lösa 'dns'

  3. Stöder AWS DocumentDB att gå med i 3+ samlingar i en enda fråga?

  4. Hur man grupperar efter dokument efter vecka i mongodb