V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
JCZ2MkKb5S8ZX9pq
V2EX  ›  MongoDB

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

  •  
  •   JCZ2MkKb5S8ZX9pq · 2020-06-19 17:36:41 +08:00 · 2685 次点击
    这是一个创建于 1617 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

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

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

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

    5 条回复    2020-06-23 15:37:08 +08:00
    thinkmore
        1
    thinkmore  
       2020-06-19 17:58:33 +08:00
    请给一点原始数据,才方便测试写出来
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       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
        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
    }
    }

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

    谢谢,arrayToObject 的确没用过,学到了。
    看这个过程,有点担心爆内存。
    thinkmore
        5
    thinkmore  
       2020-06-23 15:37:08 +08:00   ❤️ 1
    @JCZ2MkKb5S8ZX9pq 一次性处理不超过 16M 应该就没问题,所以可以先过滤下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:01 · PVG 16:01 · LAX 00:01 · JFK 03:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.