【问题标题】:Mongo aggregate - How to use $match and $group with object array fields?Mongo 聚合 - 如何将 $match 和 $group 与对象数组字段一起使用?
【发布时间】:2018-08-03 18:34:16
【问题描述】:

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

第一个示例文档:

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

第二个示例文档:

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

还有几个具有相同结构的文档。我现在需要为具有相同HO 字段的所有文档获取SP 的平均值。我正在使用meteorhacks 包来使用mongos 聚合和流星,所以我的聚合查询看起来与原生查询完全不同。我通过这个查询得到了值:

pr.aggregate(

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

);

我得到了我想要的结果:

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

但是,我无法从具有相同 HO 字段的所有文档中获得嵌套字段的平均值,例如 CCOutputFsResult。此外,我不清楚如何将pK 之类的嵌套字段用于$match,因为对于具有相同@ 的所有文档,我还需要SPCCOutputFsResult 的平均值例如 987654338@ 字段。

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

【问题讨论】:

  • 您的查询语法不正确
  • 我得到结果的问题中的查询通过使用 meteorhacks:aggregate 包工作,我需要在流星框架中使用 mongos 聚合函数。
  • 啊哦。我的错。

标签: arrays mongodb object meteor aggregation-framework


【解决方案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 驱动程序一样,但我认为这个查询会起作用

【讨论】:

  • 很好,但我认为(至少在我的情况下)“Fs.CC.Output.CCOutput”之前需要有一个“$”。添加“$”后它就可以工作了,非常感谢!您是否还知道如何使用 $match 的“pK”字段来获取具有相同 pK 字段的所有文档的 $avg?当我使用 pInfos.pK 或 pInfos.0.pK 时它崩溃了……那太好了!
  • 感谢 $ 字符,我刚刚编辑了答案。对于您关于 pk 字段的问题,您是否尝试过:$match: {"pInfos.pk": "what you want"}?它应该工作
  • 完美!我只是忘记了点符号的“”。所以你的解决方案 "pInfos.pK": "what you want" 工作正常,而 pInfos.pK: "what you want" 在我的情况下失败了。非常感谢:)
猜你喜欢
  • 2020-04-03
  • 2019-03-27
  • 1970-01-01
  • 2016-02-10
  • 2012-11-24
  • 2013-01-11
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多