如何使用 SQL 查询从 mongoDB 获取每分钟的最后一秒

Posted

技术标签:

【中文标题】如何使用 SQL 查询从 mongoDB 获取每分钟的最后一秒【英文标题】:How to get last second of every minute from mongoDB using SQL query 【发布时间】:2019-12-06 17:20:01 【问题描述】:

我有一个表格,每毫秒都有记录。我只需要使用 Mongodb sql 查询获取每分钟的最后一秒。

Id   Balance             DataTime

1  "2462188.61"  2019-09-27T05:49:33.575+00:00

1  "2449426.30"  2019-10-30T19:30:52.513+00:00

1  "2456459.67"  2019-10-15T18:20:09.490+00:00

5  "1006266.91"  2019-10-31T13:48:18.290+00:00

我尝试了 LIKE 条件,但没有成功。Select Id, DateTime,Balance from AccountBalance where DateTime like '%59.000%'

这里是 mongoldb SQL 参考的链接: https://docs.mongodb.com/bi-connector/current/supported-operations/

我正在使用 BI 连接器连接到 Tableau(因此需要查询的 sql 版本)

提前致谢!

【问题讨论】:

是sql问题还是mongodb? 我正在使用 SQL 查询 Mongodb 您是否在使用一些 GUI/IDE,例如 studio3t 或 noSQLBooster,它们基本上将这些 sql 查询转换为 mongo 查询(这对复杂查询有限制)?为什么不简单地使用 mongo 查询作为发布的答案之一。 请编辑您的问题以包含示例 MongoDB 文档以及有关您正在使用的 SQL 连接器版本和 MongoDB 服务器版本的信息。假设您的 DateTime 字段是 BSON Date 类型,则使用诸如 like 之类的字符串运算符进行匹配(大概翻译成 MongoDB 查询语言中的正则表达式)将不起作用。但是,根据您的连接器和服务器版本,可能有可用的 SQL 日期和时间函数来提取相关值。看起来您当前的示例数据与“每分钟的最后一秒”的预期查询不匹配。 感谢@ambianBeing 和@Stennie 的回复。我更新了问题 【参考方案1】:

你可以试试……

db.z.aggregate([
    $addFields:  
    year:  $dateToString:  format: "%Y", date: "$DataTime"  ,
    month:  $dateToString:  format: "%m", date: "$DataTime"  ,
    day:  $dateToString:  format: "%d", date: "$DataTime"  ,
    hour:  $dateToString:  format: "%H", date: "$DataTime"  ,
    minute:  $dateToString:  format: "%M", date: "$DataTime"  ,
    second:  $dateToString:  format: "%S", date: "$DataTime"  
    
  
]).pretty()

这假设您的字段 DataTime 的类型为 ISODate()...

示例文档:

 "_id" : ObjectId("5dea94c3b4ae6bbc17cd023b"), "Balance" : "2462188.61", "DataTime" : ISODate("2019-09-27T05:49:33.575Z") 
 "_id" : ObjectId("5dea94c3b4ae6bbc17cd023c"), "Balance" : "2449426.30", "DataTime" : ISODate("2019-10-30T19:30:52.513Z") 
 "_id" : ObjectId("5dea94c3b4ae6bbc17cd023d"), "Balance" : "2456459.67", "DataTime" : ISODate("2019-10-15T18:20:09.490Z") 
 "_id" : ObjectId("5dea94c3b4ae6bbc17cd023e"), "Balance" : "1006266.91", "DataTime" : ISODate("2019-10-31T13:48:18.290Z") 

示例查询输出:


    "_id" : ObjectId("5dea94c3b4ae6bbc17cd023b"),
    "Balance" : "2462188.61",
    "DataTime" : ISODate("2019-09-27T05:49:33.575Z"),
    "year" : "2019",
    "month" : "09",
    "day" : "27",
    "hour" : "05",
    "minute" : "49",
    "second" : "33"


    "_id" : ObjectId("5dea94c3b4ae6bbc17cd023c"),
    "Balance" : "2449426.30",
    "DataTime" : ISODate("2019-10-30T19:30:52.513Z"),
    "year" : "2019",
    "month" : "10",
    "day" : "30",
    "hour" : "19",
    "minute" : "30",
    "second" : "52"


    "_id" : ObjectId("5dea94c3b4ae6bbc17cd023d"),
    "Balance" : "2456459.67",
    "DataTime" : ISODate("2019-10-15T18:20:09.490Z"),
    "year" : "2019",
    "month" : "10",
    "day" : "15",
    "hour" : "18",
    "minute" : "20",
    "second" : "09"


    "_id" : ObjectId("5dea94c3b4ae6bbc17cd023e"),
    "Balance" : "1006266.91",
    "DataTime" : ISODate("2019-10-31T13:48:18.290Z"),
    "year" : "2019",
    "month" : "10",
    "day" : "31",
    "hour" : "13",
    "minute" : "48",
    "second" : "18"

【讨论】:

感谢您的回复@barrypicker。但是我正在编写 SQL 来查询 Mongodb。【参考方案2】:

对日期使用排序功能

例如:

db.collection.find().sort("Date_Field")

【讨论】:

Op 正在询问将查询 mongoDB 的 SQL 查询!

以上是关于如何使用 SQL 查询从 mongoDB 获取每分钟的最后一秒的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 mongodb 中的记录数

如何从 mongodb 查询和获取数组中的一项?

如何将此 sql 查询转换为 mongodb?

如何在 MongoDB 中执行此 Sql 查询

从Node JS中的MongoDB查询中获取数据

使用 Pymongo 从 Mongodb 中的 Sql 转换“distinct on”查询