我正在尝试从日志文件中准备预聚合数据集以供以后分析
例如,我有一个日志文件,例如
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-month
和entry
我的数据结果如下: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
答案 0 :(得分:0)
在MongoDB中,数组文档可以通过索引引用,但不能通过值引用。例如,在目标数据模型中,您可以使用update参数更改第一个数组元素的名称值:
{ $set: { "detail.0.name" : "me" }
甚至可以增加一个深度嵌套的值,如:
{ $inc: { "detail.0.daily.0.count" : 1 }
但是在两种情况下都知道索引是必要的,这似乎不适用于您的用例。