格式化预聚合数据

时间:2016-01-26 21:04:47

标签: node.js mongodb

我正在尝试从日志文件中准备预聚合数据集以供以后分析

例如,我有一个日志文件,例如

2016-01-01 11:13:06 -0900 alphabetical|a
2016-01-01 11:20:16 -0900 alphabetical|a
2016-01-01 11:21:52 -0900 alphabetical|b

数据(在数据/时间/时区之后)在管道上分割

entry|detail

我正在创建一个数据集,其中包含每个year-monthentry

的单独文档

我的数据结果如下:https://jsonblob.com/56a7d7d8e4b01190df4b8a55

{
    "action":"alphabetical",
    "date":"2016-0",
    "detail":{
        "a":{
            "daily":{
                "1":5,
                "2":4,
                "3":5
            },
            "monthly":14
        },
        "b":{
            "daily":{
                "1":5,
                "2":5,
                "3":2
            },
            "monthly":12
        },
        "c":{
            "daily":{
                "1":2,
                "2":2,
                "3":2
            },
            "monthly":6
        },
        "d":{
            "daily":{
                "3":1
            },
            "monthly":1
        }
    },
    "monthly":33,
    "daily":{
        "1":12,
        "2":11,
        "3":10
    },
    "dow":{
        "0":10,
        "5":12,
        "6":11
    }
}

使用

var logHit = function(data, callback){
  var update = {};
  var inc = {};
  var detail = data.data.info[1];
  inc['detail.'+escape(detail)+'.daily.'+data.date.d] = 1;
  inc['detail.'+escape(detail)+'.monthly'] = 1;
  inc['monthly'] = 1;
  inc['daily.'+data.date.d] = 1;
  inc['dow.'+data.date.dow] = 1;
  update['$inc'] = inc;

  collection.update(
    {
      directory_id: data.directory_id,
      date: data.date.y+'-'+data.date.m,
      action: data.data.info[0],
    },
    update,
    {upsert: true},
    function(error, result){
      assert.equal(error, null);
      assert.equal(1, result.result.n);
      callback();
  });
}

虽然包含了我想要存储的数据,但作为对象系列使用它会使得在检索它时更难处理。我正在使用d3.js并且必须将对象转换为数组。

如何将数据存储在数组中而不是像https://jsonblob.com/56a7da76e4b01190df4b8a74

这样的对象中
{
"action":"alphabetical",
"date":"2016-0",
"detail":[
    {
        "name":"a",
        "daily":[
            {
                "count":5
            },
            {
                "count":4
            },
            {
                "count":5
            }
        ],
        "monthly":14
    },
    {
        "name":"b",
        "daily":[
            {
                "count":5
            },
            {
                "count":5
            },
            {
                "count":2
            }
        ],
        "monthly":12
    },
    {
        "name":"c",
        "daily":[
            {
                "count":2
            },
            {
                "count":2
            },
            {
                "count":2
            }
        ],
        "monthly":6
    },
    {
        "name":"d",
        "daily":[
            {

            },
            {

            },
            {
                "count":1
            }
        ],
        "monthly":1
    }
],
"monthly":33,
"daily":{
    "1":12,
    "2":11,
    "3":10
},
"dow":{
    "0":10,
    "5":12,
    "6":11
}

}

其中对象成为数组的一部分,而密钥则放在数组中,类似于这个答案https://stackoverflow.com/a/30751981/197546

1 个答案:

答案 0 :(得分:0)

在MongoDB中,数组文档可以通过索引引用,但不能通过值引用。例如,在目标数据模型中,您可以使用update参数更改第一个数组元素的名称值:

{ $set: { "detail.0.name" : "me" }

甚至可以增加一个深度嵌套的值,如:

{ $inc: { "detail.0.daily.0.count" : 1 }

但是在两种情况下都知道索引是必要的,这似乎不适用于您的用例。

我建议也引用docs on Array Update operators