2016-12-02 29 views
0

我试图模拟我的时间序列数据中所描述:从时间序列DB结构到数组/列表?

http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb

这里有两个测量一年一天的每一个小时一个简单的例子:

{ 
year: 2042, 
id: 42, 
dataType: "something", 
data : 
    { 
    "1" : { 
     "1" : [240,210], 
     "2" : [230,220], 
     "24" : [220,130] 
     }, 
    "365" : { 
     "1" : [140,110], 
     "2" : [130,120], 
     "24" : [120,130] 
     } 
    } 
} 

随着上面的示例中,我喜欢将每个小时的第一次测量值作为每小时所有第一个值的单个数组进行检索:

[240,230,220,140,130,120] 

我试图用pymongo/python和循环来做,但这太慢了,显然效率很低。我也试图研究聚合,但没有任何运气。

  1. 是否有可能使其中的数据/投影被重构如上所示的阵列/列表的查询?
  2. 这怎么办?
  3. 对于在MongoDB中进一步阅读关于时间序列的查询和数据操作,您有什么好的建议吗?
+0

使用'mapReduce' – styvane

+0

嗨Styvane,我会用凯文回答,但本周晚些时候我会仔细看看mapReduce。 TY :-) –

回答

1

1)您可以通过使用类似下面通过聚合管道重建对象:

db.messurements.aggregate([ 
    {$project: { 
     year : 1, 
     id : 1, 
     dataType : 1, 
     data: [ 
      { day: { $literal: 1 }, values : "$data.1"}, 

      { day: { $literal: 365 }, values : "$data.365"} 
     ]} 
    } 
    ]); 

这将导致下面的输出:

{ 
     "_id" : ObjectId("58416371cf34fc678d4f161c"), 
     "year" : 2042, 
     "id" : 42, 
     "dataType" : "something", 
     "data" : [ 
       { 
         "day" : 1, 
         "values" : { 
           "1" : [ 
             240, 
             210 
           ], 
           "2" : [ 
             230, 
             220 
           ], 
           "24" : [ 
             220, 
             130 
           ] 
         } 
       }, 
       { 
         "day" : 365, 
         "values" : { 
           "1" : [ 
             140, 
             110 
           ], 
           "2" : [ 
             130, 
             120 
           ], 
           "24" : [ 
             120, 
             130 
           ] 
         } 
       } 
     ] 
} 

2)它的不漂亮,但以下汇总查询会给出预期结果:

db.messurements.aggregate([ 
    {$project: { 
     year : 1, 
     id : 1, 
     dataType : 1, 
     data: [ 
      { day: { $literal: 1 }, values : "$data.1"}, 
      { day: { $literal: 365 }, values : "$data.365"} 
    ]}}, 
    {$unwind: "$data"}, 
    {$project: { 
     year : 1, 
     id : 1, 
     dataType : 1, 
     data: [ 
      { day: "$data.day", hour: { $literal: 1 }, values : "$data.values.1"}, 
      { day: "$data.day", hour: { $literal: 2 }, values : "$data.values.2"}, 
      { day: "$data.day", hour: { $literal: 24 }, values : "$data.values.24"} 
    ]}}, 
    {$unwind: "$data"}, 
    {$project: { 
     year : 1, 
     day: "$data.day", 
     hour: "$data.hour", 
     id : 1, 
     dataType : 1, 
     values: "$data.values" 
    }}, 
    {$unwind: "$values"}, 
    {$group: { 
     _id: { 
      year: "$year", 
      day :"$day", 
      hour: "$hour"}, 
     data: {$first: "$values"} 
    }}, 
    {$group: { 
     _id: "", 
     data: { $push : "$data" } 
    }} 
]); 

将输出:

{ "_id" : "", "data" : [ 120, 130, 140, 220, 230, 240 ] } 

3) 我觉得MongoDB的网站,你可以用数据操作做什么非常机智,见 - https://docs.mongodb.com/v3.2/reference/operator/aggregation/

+0

HI凯文,非常感谢你的非常详细的答案!非常感谢! :-) –