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. MVC.netのMongoDBからObjectIdを渡す方法

    2. MongoDBで提供された配列の任意の組み合わせを含む配列フィールドのマッチング

    3. 集計フレームワークで完全なタイムスタンプが指定されている場合、日付で集計するにはどうすればよいですか?

    4. MongoDBの管理に関する考慮事項