0

これはコレクション構造です

[{
   "_id"              : "....",
   "name"             : "aaaa",
   "level_max_leaves" : [
                           {
                              level      : "ObjectIdString 1",
                              max_leaves : 4,
                           }
                        ]
},
{
   "_id"              : "....",
   "name"             : "bbbb",
   "level_max_leaves" : [
                           {
                              level      : "ObjectIdString 2",
                              max_leaves : 2,
                           }
                        ]
}]

level_max_leaves.level指定された入力値と一致するときに、フィルターのサブドキュメント値を見つける必要があります。

そして、これは私が試した方法です、

For example,

var empLevelId = 'ObjectIdString 1' ;

MyModel.aggregate(
    {$unwind: "$level_max_leaves"},
    {$match: {"$level_max_leaves.level": empLevelId } },
    {$group: { "_id": "$level_max_leaves.level", 
               "total": { "$sum": "$level_max_leaves.max_leaves" }}},
    function (err, res) {
        console.log(res);
});

しかし、ここでは$matchフィルターが機能していません。正確な結果がわかりませんObjectIdString 1

nameフィールドでフィルタリングすると、正常に機能します。このような、

{$match: {"$name": "aaaa" } },

しかし、サブドキュメント レベルでは、その return 0.

{$match: {"$level_max_leaves.level": "ObjectIdString 1"} },

私の期待した結果は、

{
   "_id"              : "ObjectIdString 1",
   "total"            : 4,
}
4

1 に答える 1

0

$matchを間違って入力しました。プレフィックス付きのフィールド$は、実装された演算子またはフィールド コンテンツへの「変数」参照用です。したがって、フィールド名を入力するだけです。

MyModel.aggregate(
    [
        { "$match": { "level_max_leaves.level": "ObjectIdString 1" } },
        { "$unwind": "$level_max_leaves" },
        { "$match": { "level_max_leaves.level": "ObjectIdString 1" } },
        { "$group": { 
            "_id": "$level_max_leaves.level", 
           "total": { "$sum": "$level_max_leaves.max_leaves" }
        }}
    ],
    function (err, res) {
        console.log(res); 
    }
);

あなたが提供するサンプルでどれが生成されますか:

{ "_id" : "ObjectIdString 1", "total" : 4 }

また$match、パイプラインの最初に配置することもお勧めします。実際、インデックスを使用できるのはこのときだけです。しかしそれだけでなく、最初の$matchステートメントがなければ、集計パイプラインは$unwind、条件を満たしているかどうかに関係なく、コレクション内のすべてのドキュメントに対して操作を実行します。

したがって、一般的にここでやりたいことは

  1. 配列に必要な要素を含むドキュメントを照合します
  2. 一致するドキュメントの配列を巻き戻します
  3. 他のすべてを除外して、必要な配列の内容を一致させます
于 2014-08-22T02:29:37.793 に答える