首页 > 解决方案 > 按多个“键”分组

问题描述

我对使用数据库很陌生,我需要查询给定的 mongoDB。数据存储在这样的文档中:

{
  "_id" : ObjectId("5b7d2aac59a5020e18762be2"),
  "configId" : "5b7d29f659a5020e18762be1",
  "deviceId" : 1,
  "timestamp" : 700,
  "posX" : 5,
  "posY" : 12,
  "valueId" : 1,
  "value" : 310.24
}

我需要的是每个 configId、每个 deviceId、每个 valueId 的最新文档(时间戳最高的文档)。

我的第一个想法是按时间戳对它们进行排序,然后以某种方式使用聚合函数对数据进行分组。但是我无法找到按多个键分组的示例。稍后我可以在我的应用程序中过滤我的数据,但我认为应该有一种“mongo 风格”的方式来做到这一点。

感谢任何让我更接近工作“mongo-style”解决方案的建议,

标签: mongodbaggregation-framework

解决方案


您可以按多个键分组 $group

例如 :

{"$group" : {"_id" : {"configId" : "$configId","deviceId" : "$deviceId"},---do what you want ($sum or $push etc..)--}}

在这里,我有 2 个具有两个不同时间戳 700 和 900的数据,它工作正常检查。

我的数据

   /* 1 */
{
    "_id" : ObjectId("5b7d2aac59a5020e18762be2"),
    "configId" : "5b7d29f659a5020e18762be1",
    "deviceId" : 1.0,
    "timestamp" : 700.0,
    "posX" : 5.0,
    "posY" : 12.0,
    "valueId" : 1.0,
    "value" : 310.24
}

/* 2 */
{
    "_id" : ObjectId("5b7d619994983bedbfda191f"),
    "configId" : "5b7d29f659a5020e18762be1",
    "deviceId" : 1.0,
    "timestamp" : 900.0,
    "posX" : 5.0,
    "posY" : 12.0,
    "valueId" : 1.0,
    "value" : 310.24
}

这是我的问题

db.col.aggregate([
            {"$sort" : {"timestamp" : -1}},
            {"$group" : {"_id" : 
                {"configId" : "$configId","deviceId" : "$deviceId","valueId" : "$valueId"},
                "data" : {"$first" : "$$ROOT"}
                }
            }
])

这是我的输出

    {
    "_id" : {
        "configId" : "5b7d29f659a5020e18762be1",
        "deviceId" : 1.0,
        "valueId" : 1.0
    },
    "data" : {
        "_id" : ObjectId("5b7d619994983bedbfda191f"),
        "configId" : "5b7d29f659a5020e18762be1",
        "deviceId" : 1.0,
        "timestamp" : 900.0,
        "posX" : 5.0,
        "posY" : 12.0,
        "valueId" : 1.0,
        "value" : 310.24
    }
}

推荐阅读