【问题标题】:Mongodb Query: Latest record by date for each itemMongodb查询:每个项目按日期的最新记录
【发布时间】:2015-03-31 11:59:27
【问题描述】:

一个集合中有六台设备,每台都有许多记录,一些有新日期的记录,一些有一周或/和一个月前的记录。我需要一个返回每个设备的最新最后记录的查询。在 .aggregate() 的情况下,我需要提交完整的“数据”。

这里是示例 json。

{
"date_time" : some-date
"device_id" : 27,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3642},{"r" : 221,"v" : 3666}]
}
{
"date_time" : some-date
"device_id" : 28,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002},{"r" : 221,"v" : 3006}]
}
{
"date_time" : some-date
"device_id" : 29,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002}, {"r" : 221,"v" : 3006}]
}

我尝试了很多查询,但没有成功。

请注意以下不适用于这种情况。

db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1})

db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1}).limit(1)

db.col.find({"device_id": {"$in": devices}}) .sort({"date_time": -1}).limit(1)

db.col.find({"device_id": {"$in": devices}}) .sort({"_id": -1}).limit(1)

我正在寻找仅提供收集中每个设备的最新记录的查询。请注意,在 .aggregate() 的情况下,我需要提交完整的“数据”。

【问题讨论】:

  • 尝试聚合查询。这将有助于找到您需要的相同结果

标签: mongodb record


【解决方案1】:

试试下面的sn-p

db.collection.aggregate([
            {$group: {
                    "_id": "$device_id",
                    "gateway_id": {"$last":"$gateway_id"},
                     data: {$last: '$data'},
                     date: {$last: '$date_time'},
                }},
            {$project: {
                     "device_id": "$_id",
                      "gateway_id": "$gateway_id",
                      "data": "$data",
                      "date_time": "$date"
                  }},
            {$sort: {
                    'date': -1
                }}
        ])

在上面按设备id和日期的查询组中,数据和gateway_id在每一行都是最新的。

输出是-

{
    "result" : [ 
        {
            "_id" : 29,
            "gateway_id" : 1,
            "data" : [ 
                {
                    "r" : 203,
                    "v" : 3002
                }, 
                {
                    "r" : 221,
                    "v" : 3006
                }
            ],
            "device_id" : 29,
            "date_time" : "a"
        }, 
        {
            "_id" : 28,
            "gateway_id" : 1,
            "data" : [ 
                {
                    "r" : 203,
                    "v" : 3002
                }, 
                {
                    "r" : 221,
                    "v" : 3006
                }
            ],
            "device_id" : 28,
            "date_time" : "b"
        }, 
        {
            "_id" : 27,
            "gateway_id" : 1,
            "data" : [ 
                {
                    "r" : 203,
                    "v" : 3642
                }, 
                {
                    "r" : 221,
                    "v" : 3666
                }
            ],
            "device_id" : 27,
            "date_time" : "a"
        }
    ],
    "ok" : 1
}

谢谢

【讨论】:

  • 您需要在聚合查询中通过 Accumulator Operator 投影所有必填字段。请查看此docs.mongodb.org/manual/reference/operator/aggregation/group 链接。我想看看你的输出模式?
  • 在查询中,我们已按 device_id 对行进行分组,即您在“数据”字段中想要的内容。要么最后,要么第一个。我没有得到你原来的要求
  • 有3个设备,每个设备都有一个data数组和记录条目date_time,每个设备在同一个集合中有很多记录。现在我需要所有设备的最新 data 数组。
  • 我刚刚更新了我的答案,您可以查看在我的控制台上看到的查询输出。请检查并相应地更新我。
  • Dineshaws 你太棒了,它有效。对我的其他要求进行了更改,它已完成,非常感谢您的关注。
【解决方案2】:

使用 findOne 代替 find 查询 db.collection.findOne({})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2016-10-13
    • 2011-01-25
    • 2023-01-22
    相关资源
    最近更新 更多