查找字段超过3天的位置

时间:2014-02-11 02:00:19

标签: mongodb mongodb-query

我有一个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")})

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

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

1 个答案:

答案 0 :(得分:3)

您的查询包含投影方面的所有元素,而不是查询方面。由于您不想更改文档的外观,因此无需投影。

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

> 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运算符。

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

相关问题