mongoose MongoDB按日期分组并选择值

e37o9pze  于 2022-12-23  发布在  Go
关注(0)|答案(2)|浏览(159)

我对MongoDB和node.js比较陌生。下面是我尝试实现的目标:
我在MongoDB中有一个包含数千个文档的集合,这些文档如下所示:

{
     "date": "2020-02-24",
     "iso_code": "USA",
     "country": "USA",
     "avg_temperature": "25F",
    },
    {
     "date": "2020-02-25",
     "iso_code": "USA",
     "country": "USA",
     "avg_temperature": "27F",
    },
    {
     "date": "2020-02-24",
     "iso_code": "CHN",
     "country": "China",
     "avg_temperature": "10C",
    }

我希望避免在node.js中运行代价高昂的计算,因此我希望接收按日期分组的温度,并检索avg_temperature的实际值(因此没有$min或$max计算)。

{ 
        "date": "2020-02-24", 
        "avg_temperatures": {
            "USA": "25F", 
            "China": "10C"
        }
     }

我的最终目标是创建一个图表,将多个国家的时间线上的数据可视化,我的想法是简单地迭代结果的内容,然后通过温度和显示数据。
如果有人以前做过类似的事情,请随时提出更好的替代方案:)

5lhxktic

5lhxktic1#

很明显,获得您所描述的结果会有点复杂。相反,您可以通过创建一个简单的聚合管道来实现

var pipeline = [
        {
            "$group" : {
                "_id" : "$date",
                "docs" : {
                    "$push" : {
                        "country" : "$country",
                        "temp" : "$avg_temperature"
                    }
                }
            }
        }
    ];

对于上面的管道,您将获得如下输出

db.stack.aggregate(pipeline).pretty()
{
    "_id" : "2020-02-25",
    "docs" : [
        {
            "country" : "USA",
            "temp" : "27F"
        }
    ]
}
{
    "_id" : "2020-02-24",
    "docs" : [
        {
            "country" : "USA",
            "temp" : "25F"
        },
        {
            "country" : "China",
            "temp" : "10C"
        }
    ]
}

希望这能解决你的问题!

ubbxdtey

ubbxdtey2#

您可以使用聚合框架来完成此操作:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$date",
      "avg_temperatures": {
        "$mergeObjects": {
          "$arrayToObject": [
            [
              {
                k: "$country",
                v: "$avg_temperature"
              }
            ]
          ]
        }
      }
    }
  }
])

Working example

相关问题