【问题标题】:Find where field is older than 3 days查找字段超过 3 天的位置
【发布时间】:2017-06-26 17:49:53
【问题描述】:

我有一个数据结构如下的 mongodb 数据库:

{ 
"_id" : "123456":, 
"Dates" : ["2014-02-05 09:00:15 PM", "2014-02-06 09:00:15 PM", "2014-02-07 09:00:15 PM"],
}

还有其他东西,但我想做的是提取 Dates{$slice: -1} 超过 3 天的数据。我有一个这样的查询,但它不起作用:

db.posts.find({}, {RecoveryPoints:{$slice: -1} $lt: ISODate("2014-02-09 00:00:00 AM")})

我开始认为这是不可能的,但我想我会先来这里。我的猜测是我必须在我的代码中执行此逻辑。

编辑:我还想提一下,我的目标是返回整个记录,而不仅仅是计算它的日期

【问题讨论】:

  • 这实际上是您在 Mongo shell 中看到的记录,还是您只是在抽象。因为如果是这些日期是字符串。此外,您在示例中比较的日期小于数组中的第一项,因此即使您的日期格式正确,也不会匹配。如果您不弄清楚这一点,就会使问题难以回答。
  • 抱歉,我已经编造了日期。生病编辑它以便更好地理解。

标签: mongodb mongodb-query


【解决方案1】:

您的查询包含投影端而不是查询端的所有元素。既然你不想改变文档的外观,那么你就不需要投影了。

这实际上是一个简单的比较,就好像你总是在看第一个元素然后你可以使用点“。”符号形式来寻找它:

> db.dates.find({ "Dates.0": {$lt: ISODate("2014-02-09 00:00:00 AM") } }).pretty()
{
    "_id" : "123456",
    "Dates" : [
            ISODate("2014-02-05T09:00:15Z"),
            ISODate("2014-02-06T09:00:15Z"),
            ISODate("2014-02-07T09:00:15Z")
    ]
}
> db.dates.find({ "Dates.0": {$lt: ISODate("2014-02-05 00:00:00 AM") } }).pretty()
>

所以点“。”表示法在数组的情况下适用于索引值,并且要获取其他元素只需更改位置:

> db.dates.find({ "Dates.1": {$lt: ISODate("2014-02-07 00:00:00 AM") } }).pretty()
{
    "_id" : "123456",
    "Dates" : [
            ISODate("2014-02-05T09:00:15Z"),
            ISODate("2014-02-06T09:00:15Z"),
            ISODate("2014-02-07T09:00:15Z")
    ]
}
> db.dates.find({ "Dates.3": {$lt: ISODate("2014-02-07 00:00:00 AM") } }).pretty()
>
> db.dates.find({ "Dates.2": {$lt: ISODate("2014-02-08 00:00:00 AM") } }).pretty()
{
    "_id" : "123456",
    "Dates" : [
            ISODate("2014-02-05T09:00:15Z"),
            ISODate("2014-02-06T09:00:15Z"),
            ISODate("2014-02-07T09:00:15Z")
    ]
}

请注意,这仅在您根据更改对数组进行排序时才有意义,否则可以确保第一个(或您正在查询的位置)元素将是您要比较的元素。如果您需要对所有元素进行其他测试,请在查询中使用 $elemMatch 运算符。

您无法通过此查询获得所需结果的唯一原因是您的日期是字符串。如果是这样,请更改它们,并更改导致它们以这种方式保存的任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2018-08-20
    • 2022-08-03
    • 2010-11-14
    • 2011-10-31
    相关资源
    最近更新 更多