sql >> Database >  >> NoSQL >> MongoDB

Ongedaan maken Ontspan in totaal in mongodb

Nou, je kunt natuurlijk gewoon $push gebruiken en $first in een $group om het document terug te brengen naar wat het was:

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

Maar je had waarschijnlijk gewoon $filter moeten gebruiken met MongoDB 3.2 in de eerste plaats:

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

En als je tenminste MongoDB 2.6 had, had je nog steeds $map en $setDifference in plaats daarvan:

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

Dat is prima als elk array-element al een "unieke" identifier heeft, dus de "set"-bewerking verwijdert gewoon de false waarden van $map .

Beide zijn manieren om inhoud uit een array te "filteren" zonder daadwerkelijk gebruik te maken van $unwind

NB :Ik weet niet zeker of je die $in wordt gebruikt om overeen te komen met een "lijst met voorwaarden" in plaats van te moeten matchen op arrays. Dus over het algemeen kan de toestand gewoon zijn:

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

Waar je eigenlijk maar één waarde hebt om op te matchen. Je gebruikt $in en $of wanneer u een "lijst" met voorwaarden heeft. Arrays zelf maken geen verschil voor de vereiste operator.




  1. Hoe Spring-sessies configureren om met Redis in xml te werken?

  2. Is er een vergrendelingsmechanisme in Azure Redis Cache tijdens het bijwerken van een item?

  3. Een ISODate maken voor MongoDB met PHP

  4. MongoDB:query Array voor 'true' waarde bij index n