比如
group = {'_id':'$uid','num':{'$push':'$num'}}
aggregate([match, group])
这样生成的结果,num 是一个列表 /数组。
如果我希望 num 结果是一个{date:num,...}的字典,应该用什么命令?
1
thinkmore 2020-06-19 17:58:33 +08:00
请给一点原始数据,才方便测试写出来
|
2
JCZ2MkKb5S8ZX9pq OP @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, ...}}, ... |
3
thinkmore 2020-06-23 10:32:44 +08:00 1
@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 } } ``` |
4
JCZ2MkKb5S8ZX9pq OP |
5
thinkmore 2020-06-23 15:37:08 +08:00 1
@JCZ2MkKb5S8ZX9pq 一次性处理不超过 16M 应该就没问题,所以可以先过滤下
|