sql >> Database >  >> NoSQL >> MongoDB

Mongodb telt alle array-elementen in alle objecten die overeenkomen met criteria

De meest "performante" manier om dit te doen, is door de $unwind . over te slaan heel en eenvoudig $group tellen. In wezen "filter" arrays krijgen de $size van de resultaten naar $sum :

db.objects.aggregate([
    { "$match": {
        "createddate": {
            "$gte": ISODate("2015-08-30T00:00:00.000Z")
        },
        "activity.action": "test_action"
    }},
    { "$group": {
        "_id": null,
        "count": {
            "$sum": {
                "$size": {
                    "$setDifference": [
                        { "$map": {
                            "input": "$activity",
                            "as": "el",
                            "in": {
                                "$cond": [ 
                                    { "$eq": [ "$$el.action", "test_action" ] },
                                    "$$el",
                                    false
                                ]
                            }               
                        }},
                        [false]
                    ]
                }
            }
        }
    }}
])

Toekomstige releases van MongoDB hebben $filter , wat dit veel eenvoudiger maakt:

db.objects.aggregate([
    { "$match": {
        "createddate": {
            "$gte": ISODate("2015-08-30T00:00:00.000Z")
        },
        "activity.action": "test_action"
    }},
    { "$group": {
        "_id": null,
        "count": {
            "$sum": {
                "$size": {
                    "$filter": {
                        "input": "$activity",
                        "as": "el",
                        "cond": {
                            "$eq": [ "$$el.action", "test_action" ]
                        }
                    }
                }
            }
        }
    }}
])

$unwind gebruiken zorgt ervoor dat de documenten de-normaliseren en creëert effectief een kopie per array-invoer. Vermijd dit waar mogelijk vanwege de vaak extreme kosten. Het filteren en tellen van array-items per document is in vergelijking veel sneller. Zoals een eenvoudige $match en $group pijplijn vergeleken met vele fasen.



  1. Beheersstroomprobleem met node/redis en callbacks?

  2. Hoe het wachtwoordveld in Mongoose/MongoDB te beveiligen, zodat het niet terugkeert in een query wanneer ik verzamelingen vul?

  3. Bulkupdate van documenten in MongoDB

  4. Tijdstip van aanmaken van sleutel in redis