Mongo聚合 - 如何将$ match和$ group与对象数组字段一起使用?

时间:2018-04-10 12:04:56

标签: arrays mongodb object meteor aggregation-framework

我的pr集合中包含以下文档数据结构,我想将$group$avg结合使用,以获取特定字段的平均值:

第一个示例doc:

   {
    "_id" : "MRoPGeY7atYiPm5nW",
    "HO" : "dfd>prZKfHepCR7jEB2Lk",
    "SP" : 22,
    "pInfos" : [ 
        {
            "pId" : "A",
            "pK" : "B"
        }
    ],
    "Fs" : {
        "CC" : {
            "Output" : {
                "CCOutput" : 24,
                "CCOutput2" : 26
            },
            "FsResult" : 28
        }
    },
    "SPS" : 30
}

第二个示例doc:

 {
        "_id" : "AAoPGeY7atYiPm5nW",
        "HO" : "dfd>prZKfHepCR7jEB2Lk",
        "SP" : 12,
        "pInfos" : [ 
            {
                "pId" : "A",
                "pK" : "B"
            }
        ],
        "Fs" : {
            "CC" : {
                "Output" : {
                    "CCOutput" : 24,
                    "CCOutput2" : 26
                },
                "FsResult" : 28
            }
        },
        "SPS" : 30
    }

还有几个具有相同结构的文档。我现在需要为具有相同SP字段的所有文档获取HO的平均值。我使用meteorhacks包能够使用mongos聚合与meteor,所以也许我的聚合查询看起来与本机完全不同。我通过此查询获取值:

pr.aggregate(

{ $match: { HO: "dfd>prZKfHepCR7jEB2Lk"} },
{ $group: { _id: '$HO', total: { $avg: '$SP' } } },
{ $project: {total:1, _id:0 } }

);

我得到了我想要的结果:

[ {_id: 'dfd>prZKfHepCR7jEB2Lk', total: 17 } ]

但是,我无法从具有相同CCOutput字段的所有文档中获取FsResultHO等嵌套字段的平均值。另外,我不清楚如何为pK使用$match之类的嵌套字段,因为我还需要SPCCOutput和{{1}的平均值例如,对于具有相同FsResult字段的所有文档。

我认为如何将pK$match与嵌套字段一起使用的常见(Mongo原生)方式也适用于meteorhacks。

1 个答案:

答案 0 :(得分:1)

尝试使用虚线表示法:

pr.aggregate([
    {$match: {HO: "dfd>prZKfHepCR7jEB2Lk"}},
    {$group: {_id: "$HO", total: {$avg: "$SP"}, totalCCoutput: {$avg: "$Fs.CC.Output.CCoutput"}, totalFs: {$avg: "$Fs.CC.FsResult"}}}
]);

我写的就像我使用Nodejs Mongo驱动程序一样,但我认为这个查询可以正常工作