【问题标题】:Is it possible to parse Queries in MongoDB to get more specific results?是否可以在 MongoDB 中解析查询以获得更具体的结果?
【发布时间】:2017-07-07 14:20:13
【问题描述】:

我想在我的 mongoDb 中获得大于 2:00 且小于 8:00 的时间。但是,我的数据如下所示:

{"时间": "4:35"}

冒号阻止我进行类似“db.collection.find({ time: { $gt: 2, $lt: 8 } })”的查询。有什么方法可以查询吗? (也许在不改变内部数据的情况下将 4:35 解析为 435)

【问题讨论】:

  • 如果时间存储为04:35,您可以依赖字符串排序,那么您可以使用02:0008:00。不幸的是,最好的选择是修复数据。

标签: node.js mongodb database nosql


【解决方案1】:

如果你只是想搜索 2 到 8 之间的时间,那么你可以试试这个:

db.collection.find( { time: { $gt: "2:00", $lt: "8:00" } } )

这就是我所做的测试。我在集合中插入了一些数据,这里是列表:

db.time.find({},{"_id":0})
{“我的时间”:“4:35”}
{“我的时间”:“1:35”}
{“我的时间”:“6:35”}
{“我的时间”:“8:35”}
{“我的时间”:“10:35”}
{“我的时间”:“10:10”}

db.time.find( { mytime: { $gt: "2:00", $lt: "8:00" } }, {"_id":0} )
{“我的时间”:“4:35”}
{“我的时间”:“6:35”}

【讨论】:

  • 10 会小于 8 以这种方式进行字符串排序
  • 不幸的是,这不起作用:(数据库中的值不是数字。它是一个看起来像这样的字符串->“4:35”
  • 这很有帮助。我做了一个小规模的测试,它确实有效!不过有一个小问题。如果你插入“21:34”,这个值也会被返回。我相信原因是因为第一个数字在范围内。这是我要弄清楚的下一件事。非常感谢
  • 如果您将小时数设为 2:00,您应该能够过滤 21:34 db.time.find( { "mytime": { $gt: "2:00", $lt: "8:00" } }, {"_id":0} )
【解决方案2】:

将时间存储为字符串是个坏主意。不幸的是,MongoDB 没有专门的 time-only 数据类型,但有两种选择不如使用字符串那么糟糕:

  1. 使用 BSON 日期。如果存储年、月和日会适得其反,请将所有这些设置为相同的值(可以选择时代的开始,即 1970 年 1 月 1 日)。
  2. 使用整数,并让它表示自午夜以来的分钟数或秒数。在应用层进行转换。

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2017-10-16
    相关资源
    最近更新 更多