sql >> Databáze >  >> NoSQL >> MongoDB

Zpět Uvolněte se souhrnně v mongodb

Samozřejmě můžete použít pouze $push a $first v $group abyste získali dokument zpět do stavu, v jakém byl:

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

Pravděpodobně jste ale měli použít $filter s MongoDB 3.2 na prvním místě:

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

A pokud jste měli alespoň MongoDB 2.6, stále jste mohli použít $map a $setDifference místo toho:

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

To je naprosto v pořádku, když každý prvek pole již má „jedinečný“ identifikátor, takže operace „set“ pouze odstraní false hodnoty z $map .

Oba jsou způsoby, jak „filtrovat“ obsah z pole bez skutečného použití $unwind

N.B :Nejsem si jistý, jestli opravdu rozumíte tomu $in se používá pro shodu se "seznamem podmínek" místo toho, aby bylo vyžadováno, aby se shodovaly na polích. Obecně tedy podmínka může být:

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

Kde ve skutečnosti máte pouze jedinou hodnotu, se kterou se můžete porovnat. Používáte $in a $or když máte "seznam" podmínek. Pole sama o sobě neznamenají žádný rozdíl pro požadovaný operátor.




  1. Vyhledávací kanál:`$match` místní pole `$in` pole, když z hodnoty je pole a má být nalezena místní hodnota

  2. MongoDB - Java | Jak spravovat připojení

  3. MongoDB:Jak používat jedno schéma jako dílčí dokument pro různé kolekce definované v různých souborech

  4. Předplatitelé a vydavatelé Redis pub sub max