MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongodb преброява всички елементи на масива във всички обекти, съвпадащи по критерии

Най-„ефективният“ начин да направите това е да пропуснете $unwind общо и просто $group да броим. По същество „филтърните“ масиви получават $size от резултатите до $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]
                    ]
                }
            }
        }
    }}
])

Бъдещите издания на MongoDB ще имат $filter , което прави това много по-просто:

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 кара документите да се денормализират и ефективно създава копие за запис в масив. Когато е възможно, трябва да избягвате това поради често екстремната цена. Филтрирането и преброяването на записи в масив на документ е много по-бързо в сравнение. Както е просто $match и $group тръбопровод в сравнение с много етапи.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB ИЗБЕРЕТЕ БРОЙ ГРУПА ОТ

  2. Коя NoSQL база данни трябва да използвам за регистриране?

  3. Асоциация „Много към много“ на MongoDB

  4. Как да стартирам Mongo DB от Windows?

  5. Йерархични заявки с Mongo с помощта на $graphLookup