MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongodb zlicza wszystkie elementy tablicy we wszystkich obiektach spełniających kryteria

Najbardziej „skutecznym” sposobem na to jest pominięcie $unwind w sumie i po prostu $group liczyć. Zasadniczo tablice „filtruj” otrzymują $size wyników do $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]
                    ]
                }
            }
        }
    }}
])

Przyszłe wersje MongoDB będą miały $filter , dzięki czemu jest to znacznie prostsze:

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

Korzystanie z $unwind powoduje denormalizację dokumentów i efektywne tworzenie kopii dla każdego wpisu tablicy. Tam, gdzie to możliwe, należy tego unikać ze względu na często ekstremalne koszty. W porównaniu z tym filtrowanie i liczenie wpisów tablicy na dokument jest znacznie szybsze. Tak jak proste $match i $group potok w porównaniu do wielu etapów.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $setOnInsert

  2. Jak używać $regex w zapytaniu agregującym mongodb w $match

  3. Aktualizacja dużej liczby rekordów w kolekcji

  4. Node.js + mangusta znajdź zawiesza węzeł, gdy ponad 100 wyników

  5. MongoDB $concat