【问题标题】:MongoDb searching nested array between dateTimes using RobomongoMongoDb 使用 Robomongo 在 dateTimes 之间搜索嵌套数组
【发布时间】:2016-07-14 15:46:36
【问题描述】:

我是 MongoDb 的新手,正在尝试是否可以使用它来存储时间序列数据。

我已插入以下数据...

{
"_id" : ObjectId("5785f186ed936527c05efa10"),
"Timestamp" : ISODate("2006-07-13T07:42:00.000Z"),
"Label1" : "Lab1",
"Attr" : "atrr1",
"Readings" : [ 
    {
        "DateTime" : ISODate("2006-07-13T07:42:06.355Z"),
        "Value" : "22"
    }, 
    {
        "DateTime" : ISODate("2006-07-13T07:42:07.355Z"),
        "Value" : "22"
    }, 
    {
        "DateTime" : ISODate("2006-07-13T07:42:08.355Z"),
        "Value" : "22"
    }, 
  ....

因此,每个文档都是以 1 秒为间隔保存 DateTimes 的数组 Readings。

所以,如果我想在 2 个日期时间之间进行查询,我正在 Robomongo 查询窗口中尝试以下操作...

db.getCollection('Timedata').find(
 {
 'Readings.DateTime':    
    { $gt: '2005-07-13 07:42:13.355Z',  $lt: '2010-07-13 07:42:13.355Z'}        
  })

但是,这总是返回 Fetched 0 record(s) in 11ms,因为它实际上应该全部返回。

我的语法一定不正确,但我只是找不到它有什么问题以及如何在嵌套数组中搜索日期时间,就像我在这里一样。有人有什么想法吗?

提前致谢!

【问题讨论】:

    标签: mongodb robo3t


    【解决方案1】:
    db.getCollection('Timedata').find(
     {
     Readings: {
       $elemMatch: 
         {DateTime: 
            {
                $gt: ISODate('2005-07-13 07:42:13.355Z'),
                $lt: ISODate('2010-07-13 07:42:13.355Z')
            }
         }
      }   
    });
    
    
    db.getCollection('Timedata').aggregate([
        {
            $match:{
            Readings: {
               $elemMatch: 
                 {DateTime: 
                    {
                        $gt: ISODate('2005-07-13 07:42:13.355Z'),
                        $lt: ISODate('2010-07-13 07:42:13.355Z')
                    }
                 }
              } 
            }
        },
       {
          $project: {
             _id:1,
             Timestamp:1,
             Label1:1,
             Attr:1,
             Readings: {
                $filter: {
                   input: "$Readings",
                   as: "item",
                   cond: { 
                       $and: [
                            {$gt: [ "$$item.DateTime", ISODate('2006-07-13 07:00:13.355Z') ]},
                            {$lt: ["$$item.DateTime", ISODate('2010-07-15 07:42:13.355Z')]}
                       ]
                   }
                }
             }
          }
       }
    ])
    

    【讨论】:

    • 非常感谢,完美运行!我将研究这种语法,这与我在某些文档中看到的方式完全不同。
    • 实际上,我想我可能在这里跳了枪。上面返回了在该时间段内有任何读数的整个文档,包括落在过滤器之外的读数。希望有一种方法可以让第一个和最后一个文档也只包含该时间段内的读数。 “手动”可以做到这一点吗?
    • 查看更新的答案。只需更改字段中的日期即可。
    • 太好了,谢谢!是的,现在结果已经过滤了读数。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2016-01-13
    • 2015-06-29
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多