我有一个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")})
我开始认为不可能,但我想我会先来这里。我的猜测是我必须在我的代码中执行此逻辑。
编辑:我还想提一下,我的目标是返回整个记录,而不仅仅是匹配它的日期
答案 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运算符。
使用此查询无法获得所需结果的唯一原因是您的日期是字符串。如果是这样,请更改它们,并更改导致它们以这种方式保存的任何代码。