我正在使用MongoDB 2.6.6
我在MongoDB集合中有这些文档,这是一个例子:
{ ..., "field3" : { "one" : [ ISODate("2014-03-18T05:47:33Z"),ISODate("2014-06-02T20:00:25Z") ] }, ...}
{ ..., "field3" : { "two" : [ ISODate("2014-03-18T05:47:33Z"),ISODate("2014-06-02T20:00:25Z") ] }, ...}
{ ..., "field3" : { "three" : [ ISODate("2014-03-18T05:47:39Z"),ISODate("2014-03-19T20:18:38Z") ] }, ... }
我想将这些文档合并到一个字段中。举个例子,我希望新结果如下:
{ "field3", : { "all" : [ ISODate("2014-03-18T05:47:39Z"),ISODate("2014-03-19T20:18:38Z"),...... ] },}
我只是不确定如何获得这个结果!任何帮助表示赞赏。谢谢。
答案 0 :(得分:2)
这里真的不遗余力,但你可以用mapReduce获得那种合并结果:
db.collection.mapReduce(
function() {
var field = this.field3;
Object.keys(field).forEach(function(key) {
field[key].forEach(function(date) {
emit( "field3", { "all": [date] } )
});
});
},
function (key,values) {
var result = { "all": [] };
values.forEach(function(value) {
value.all.forEach(function(date) {
result.all.push( date );
});
});
result.all.sort(function(a,b) { return a.valueOf()-b.valueOf() });
return result;
},
{ "out": { "inline": 1 } }
)
鉴于mapReduce自身的限制,mapReduce并不完全采用相同的输出格式:
{
"results" : [
{
"_id" : "field3",
"value" : {
"all" : [
ISODate("2014-03-18T05:47:33Z"),
ISODate("2014-03-18T05:47:33Z"),
ISODate("2014-03-18T05:47:39Z"),
ISODate("2014-03-19T20:18:38Z"),
ISODate("2014-06-02T20:00:25Z"),
ISODate("2014-06-02T20:00:25Z")
]
}
}
],
"timeMillis" : 86,
"counts" : {
"input" : 3,
"emit" : 6,
"reduce" : 1,
"output" : 1
},
"ok" : 1
}
由于此处聚合为单个文档是相当随意的,因此您可以在客户端代码中采用相同的方法。
无论如何,这只会对相对较小的数据集有用,而且对客户端处理的限制相同。超过MongoDB的16MB BSON限制,但肯定受到消耗的内存的限制。
所以我认为你需要添加一个“查询”参数但是你的问题并不是很清楚。无论是使用mapReduce还是客户端代码,您基本上都需要遵循这种过程来将阵列“混合”在一起。
我个人会在这里使用客户端代码。