按多个“键”分组

时间:2018-08-22 10:17:00

标签: mongodb aggregation-framework

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

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

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

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

感谢您提供任何建议,这些建议使我更接近可行的“蒙哥式”解决方案,

1 个答案:

答案 0 :(得分:0)

您可以按多个键$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
    }
}