【问题标题】:Average of Array Values by Position from a set of documents一组文档中按位置排列的数组值的平均值
【发布时间】:2018-04-22 12:05:17
【问题描述】:

我最近写了一个我尝试过的问题,但它导致了另一个问题。 original question 和 @NeilLunn 帮助我解决了这个问题。

他创建的脚本,然后我修改为我的使用如下:

db.getCollection('widget_documents').aggregate([
{ "$unwind": { "path": "$graph_data", "includeArrayIndex": "index" } },
{ "$group": {
"_id": {
  "group": "$displayname",
  "index": "$index"
},
"graph_data": { "$avg": "$graph_data.value" }
}},
{ "$sort": { "_id": 1 } },
{ "$group": {
  "_id": "$_id.group",
  "graph_data": { "$push": "$graph_data" }
}},
{ "$sort": { "_id": 1 } }  
])

它应该展开一个数组,然后创建每个逗号分隔值的平均值并保持它们的相同位置。但是,这些值都是空的,我无法解决如何修复。见以下结果:

/* 1 */
{
"_id" : "Accommodation & Functions",
"graph_data" : [
    null,
    null
]
},

/* 2 */
{
"_id" : "Agriculture & Forestry",
"graph_data" : [
    null,
    null
]
},

/* 3 */
{
"_id" : "Business & Professional Services",
"graph_data" : [
    null,
    null
]
}

我包含了用于此聚合的数据集。我想要的结果是两个平均值。我还想包含一个字段,该字段包含每个组中的文档数。

/* 1 createdAt:20/04/2018, 16:12:27*/
{
"_id" : ObjectId("5ad968ab72f71f12a8298435"),
"object_class" : "De-normalised Datapoint",
"object_type" : "website-traffic",
"object_creation_date" : ISODate("2016-10-25T13:37:33.173+13:00"),
"party_uuid" : "b92ffd39-4382-4c48-86a5-3fe5f36aaa70",
"subscription_uuid" : "4f6731ca-0e1e-4808-91f8-8aa46f2f27ec",
"profile_id" : "8198633",
"extras" : [
    {
        "label_key" : "d.3",
        "value_1" : 43,
        "value_2" : 519743
    },
    {
        "label_key" : "d.4",
        "value_1" : 25,
        "value_2" : 236700
    },
    {
        "label_key" : "d.5",
        "value_1" : 33,
        "value_2" : 134790
    },
    {
        "label_key" : "d.6",
        "value_1" : 12,
        "value_2" : 0
    },
    {
        "label_key" : "d.7",
        "value_1" : 10,
        "value_2" : 2407250
    },
    {
        "label_key" : "d.1",
        "value_1" : 32,
        "value_2" : 54143
    },
    {
        "label_key" : "d.2",
        "value_1" : 35,
        "value_2" : 224333
    },
    {
        "label_key" : "d.3",
        "value_1" : 33,
        "value_2" : 70071
    },
    {
        "label_key" : "d.4",
        "value_1" : 28,
        "value_2" : 505857
    },
    {
        "label_key" : "d.5",
        "value_1" : 19,
        "value_2" : 11941
    },
    {
        "label_key" : "d.6",
        "value_1" : 9,
        "value_2" : 205000
    },
    {
        "label_key" : "d.7",
        "value_1" : 12,
        "value_2" : 21400
    },
    {
        "label_key" : "d.1",
        "value_1" : 25,
        "value_2" : 4600
    },
    {
        "label_key" : "d.2",
        "value_1" : 1,
        "value_2" : 10000
    }
],
"graph_data" : [
    {
        "data_set_name" : "unique.visits",
        "value" : [
            35,
            20,
            31,
            11,
            8,
            28,
            30,
            26,
            21,
            17,
            8,
            7,
            20,
            0
        ]
    },
    {
        "data_set_name" : "repeat.visits",
        "value" : [
            8,
            5,
            2,
            1,
            2,
            4,
            5,
            7,
            7,
            2,
            1,
            5,
            5,
            1
        ]
    }
],
"displayname" : "Accommodation & Functions"
},

/* 2 createdAt:20/04/2018, 16:12:27*/
{
"_id" : ObjectId("5ad968ab72f71f12a8298436"),
"object_class" : "De-normalised Datapoint",
"object_type" : "website-traffic",
"object_creation_date" : ISODate("2016-10-06T11:53:58.960+13:00"),
"party_uuid" : "f5b3ca48-52c3-4f3d-b84f-8240e0a4b844",
"subscription_uuid" : "fbfe4f05-3eba-4db5-822c-6996cec71683",
"profile_id" : "71567572",
"extras" : [
    {
        "label_key" : "d.4",
        "value_1" : 212,
        "value_2" : 534000
    },
    {
        "label_key" : "d.5",
        "value_1" : 246,
        "value_2" : 220000
    },
    {
        "label_key" : "d.6",
        "value_1" : 60,
        "value_2" : 179000
    },
    {
        "label_key" : "d.7",
        "value_1" : 36,
        "value_2" : 344000
    },
    {
        "label_key" : "d.1",
        "value_1" : 152,
        "value_2" : 332000
    },
    {
        "label_key" : "d.2",
        "value_1" : 227,
        "value_2" : 426000
    },
    {
        "label_key" : "d.3",
        "value_1" : 314,
        "value_2" : 434000
    },
    {
        "label_key" : "d.4",
        "value_1" : 223,
        "value_2" : 389000
    },
    {
        "label_key" : "d.5",
        "value_1" : 268,
        "value_2" : 269000
    },
    {
        "label_key" : "d.6",
        "value_1" : 145,
        "value_2" : 261000
    },
    {
        "label_key" : "d.7",
        "value_1" : 39,
        "value_2" : 202000
    },
    {
        "label_key" : "d.1",
        "value_1" : 245,
        "value_2" : 336000
    },
    {
        "label_key" : "d.2",
        "value_1" : 203,
        "value_2" : 180000
    },
    {
        "label_key" : "d.3",
        "value_1" : 174,
        "value_2" : 223000
    }
],
"graph_data" : [
    {
        "data_set_name" : "unique.visits",
        "value" : [
            93,
            184,
            27,
            23,
            92,
            95,
            187,
            125,
            174,
            110,
            24,
            137,
            110,
            111
        ]
    },
    {
        "data_set_name" : "repeat.visits",
        "value" : [
            119,
            62,
            33,
            13,
            60,
            132,
            127,
            98,
            94,
            35,
            15,
            108,
            93,
            63
        ]
    }
],
"displayname" : "Retail & Shopping"
},

/* 3 createdAt:20/04/2018, 16:12:27*/
{
"_id" : ObjectId("5ad968ab72f71f12a8298437"),
"object_class" : "De-normalised Datapoint",
"object_type" : "website-traffic",
"object_creation_date" : ISODate("2016-11-14T17:29:30.155+13:00"),
"party_uuid" : "b79eebdb-0bab-45c7-b6ef-1faec1c1c3bb",
"subscription_uuid" : "865768db-49de-4cc9-86f5-960de932e589",
"profile_id" : "71567572",
"extras" : [
    {
        "label_key" : "d.2",
        "value_1" : 163,
        "value_2" : 219024
    },
    {
        "label_key" : "d.3",
        "value_1" : 261,
        "value_2" : 335845
    },
    {
        "label_key" : "d.4",
        "value_1" : 224,
        "value_2" : 506752
    },
    {
        "label_key" : "d.5",
        "value_1" : 292,
        "value_2" : 459927
    },
    {
        "label_key" : "d.6",
        "value_1" : 222,
        "value_2" : 100621
    },
    {
        "label_key" : "d.7",
        "value_1" : 127,
        "value_2" : 141699
    },
    {
        "label_key" : "d.1",
        "value_1" : 256,
        "value_2" : 568735
    },
    {
        "label_key" : "d.2",
        "value_1" : 396,
        "value_2" : 354892
    },
    {
        "label_key" : "d.3",
        "value_1" : 388,
        "value_2" : 481027
    },
    {
        "label_key" : "d.4",
        "value_1" : 375,
        "value_2" : 612040
    },
    {
        "label_key" : "d.5",
        "value_1" : 247,
        "value_2" : 186809
    },
    {
        "label_key" : "d.6",
        "value_1" : 372,
        "value_2" : 91135
    },
    {
        "label_key" : "d.7",
        "value_1" : 272,
        "value_2" : 123998
    },
    {
        "label_key" : "d.1",
        "value_1" : 284,
        "value_2" : 525792
    }
],
"graph_data" : [
    {
        "data_set_name" : "unique.visits",
        "value" : [
            108,
            206,
            146,
            199,
            190,
            110,
            189,
            323,
            309,
            298,
            184,
            350,
            259,
            233
        ]
    },
    {
        "data_set_name" : "repeat.visits",
        "value" : [
            55,
            55,
            78,
            93,
            32,
            17,
            67,
            73,
            79,
            77,
            63,
            22,
            13,
            51
        ]
    }
],
"displayname" : "Cafes, Restaurants, Hotels & Food"
}

这不是完整的集合,但你会明白的。感谢您对此提供的所有帮助,非常感谢。

【问题讨论】:

  • 没有任何东西叫"value",因此结果是null。那里都有"value_1""value_2"
  • 嗨 @NeilLunn 向下滚动到名为 graph_data 的数组
  • 对不起,我现在看到了。您缺少$unwind。你知道的数组中的数组。
  • 啊——刚刚完成!谢谢 - 最后一件事。您会注意到 graph_data 数组中有两组数据。我想我还需要按 graph_data.data_set_name 分组,并在每个文档中包含 data_set_name 。我尝试将其添加到组中,但它导致了错误。我的方法看起来正确吗?谢谢

标签: mongodb aggregation-framework


【解决方案1】:

如前所述,您似乎在解释中缺少$unwind,因为存在“数组中的数组”。因此,这将是:

db.getCollection('widget_documents').aggregate([
  { "$unwind": "$graph_data" },
  { "$unwind": { "path": "$graph_data.value", "includeArrayIndex": "index" } },
  { "$group": {
    "_id": {
      "group": "$displayname",
      "index": "$index"
    },
    "graph_data": { "$avg": "$graph_data.value" }
  }},
  { "$sort": { "_id": 1 } },
  { "$group": {
    "_id": "$_id.group",
    "graph_data": { "$push": "$graph_data" }
  }},
  { "$sort": { "_id": 1 } }  
])

或者,如果您真的想要每个数组条目的“内部”"data_set_name",那么您需要类似:

db.getCollection('widget_documents').aggregate([
  { "$unwind": "$graph_data" },
  { "$unwind": { "path": "$graph_data.value", "includeArrayIndex": "index" } },
  { "$group": {
    "_id": {
      "group": {
        "displayname": "$displayname",
        "data_set": "$graph_data.data_set_name"
      },
      "index": "$index"
    },
    "graph_data": { "$avg": "$graph_data.value" }
  }},
  { "$sort": { "_id": 1 } },
  { "$group": {
    "_id": "$_id.group",
    "graph_data": { "$push": "$graph_data" }
  }},
  { "$sort": { "_id": 1 } }  
])

其中任何一个都是在他们实际“分组”的文档中保持数组“平均值”,如果有的话。在您的示例中,这只是每个文档,因为每个文档都有唯一的“显示名称”值。

【讨论】:

  • 谢谢@NeilLunn 就是这样,我用的第二个很完美,非常感谢,再次
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2020-06-10
  • 2014-01-22
  • 2021-09-06
  • 2012-12-18
相关资源
最近更新 更多