mongodb 问题 - aggregate group 怎么生成字典结果?

2020-06-19 17:36:41 +08:00
 JCZ2MkKb5S8ZX9pq

比如

group = {'_id':'$uid','num':{'$push':'$num'}}
aggregate([match, group])

这样生成的结果,num 是一个列表 /数组。

如果我希望 num 结果是一个{date:num,...}的字典,应该用什么命令?

2592 次点击
所在节点    MongoDB
5 条回复
thinkmore
2020-06-19 17:58:33 +08:00
请给一点原始数据,才方便测试写出来
JCZ2MkKb5S8ZX9pq
2020-06-19 18:10:52 +08:00
@thinkmore 粗暴一点的方法我也能写,就是想请教下有没有类似 push 这种命令,可以直接组合$date 和$num 为字典。

原始数据就类似

for uid in range(10):
----for date in range(20200610, 20200619):
--------num = random.radint(100)
--------db.sample.insert_one({uid:uid, date:date, num:num})

我写的那个 match 可以忽略

期望输出是
{_id: uid1, num: {date1: num1, date2: num2, ...}},
...
thinkmore
2020-06-23 10:32:44 +08:00
@JCZ2MkKb5S8ZX9pq 今天才上班,才看到。

```js
function myRandom(min, max) {
return Math.round(Math.random() * (max - min)) + min;
}

var id = 1;
for(var uid = 1; uid <= 10; uid++) {
for(var date = 20200610; date <= 20200619; date++){
var num = myRandom(1,100);
db.sample.insertOne({_id: NumberInt(id), uid:NumberInt(uid), date: "" + date, num:NumberInt(num)});
id++;
}
}
```

你想要的查询如下:

```mongodb
db.getCollection('sample').aggregate([{
$group: {
_id: "$uid",
myNum: {
$push: {
"k": "$date",
"v": "$num"
}
}
}
}, {
$project: {
_id: 1,
num: {
$arrayToObject: "$myNum"
}
}
}]);

```

输出结果如下:

```json
{
"_id" : 8,
"num" : {
"20200610" : 92,
"20200611" : 98,
"20200612" : 22,
"20200613" : 53,
"20200614" : 81,
"20200615" : 15,
"20200616" : 61,
"20200617" : 59,
"20200618" : 47,
"20200619" : 43
}
}

```
JCZ2MkKb5S8ZX9pq
2020-06-23 14:23:12 +08:00
@thinkmore

谢谢,arrayToObject 的确没用过,学到了。
看这个过程,有点担心爆内存。
thinkmore
2020-06-23 15:37:08 +08:00
@JCZ2MkKb5S8ZX9pq 一次性处理不超过 16M 应该就没问题,所以可以先过滤下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683117

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX