QueryView 插件的视图玩法——统计每月阅读量

1、在文档内填入属性。如图所示:按格式填入键值(注意是中文:);

image.png

2、

根据属性值文本排序,例如年月:202410

  • //!js
    const query = async () => {
        let dv = Query.DataView(protyle, item, top);
        const SQL = `
        SELECT
      (SELECT SUBSTR(content,4, 10) 
       FROM blocks 
         WHERE content REGEXP '^年月:[0-9]+(\.[0-9]+)?$' 
         AND root_id = b.id
       LIMIT 1) AS month,
       COUNT(*) AS count
    FROM blocks b
     WHERE type = 'd'
     AND id IN (SELECT root_id
                 FROM blocks
                 WHERE content REGEXP '^时间:[0-9]+(\.[0-9]+)?$')
    GROUP BY month
    ORDER BY month`;
    
        let blocks = await Query.sql(SQL);
        dv.addeline(blocks.pick('month'), blocks.pick('count'), {
            title: '每月阅读量',
            xlabel: '月份',
            ylabel: '书籍数目'
        });
    
        dv.render();
    }
    
    return query();
    

3、结果如图:间接实现了模板列的查询统计image.png

4、疑问和求助

能否按月统计阅读时间?

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23843 引用 • 96946 回帖 • 4 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8890 引用 • 40504 回帖 • 128 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 不清楚你说的统计阅读时间是啥,我就按照我理解中的写了一下。

    在没有属性标识,单纯靠关键字来查询文档还是麻烦了一点,我后面想想看能不能加一些这方面的工具函数。

    //!js
    const contentReg = async (reg) => {
        return Query.sql(`select * from blocks where content REGEXP '^${reg}$'`);
    }
    
    const extractNumber = (blocks, prefix) => {
        return blocks.map(block => {
            const match = block.content.match(new RegExp(`${prefix}:([0-9]+(?:\\.[0-9]+)?)`));
            return match ? { ...block, number: parseFloat(match[1]) } : null;
        }).filter(Boolean);
    };
    
    const query = async () => {
        // 创建数据视图对象
        let dv = Query.DataView(protyle, item, top);
    
        // 1. 构建 SQL 提取 content
        let with年月 = await contentReg('年月:[0-9]+(\.[0-9]+)?');
        let with时间 = await contentReg('时间:[0-9]+(\.[0-9]+)?');
    
        with年月 = extractNumber(with年月, '年月');
        with时间 = extractNumber(with时间, '时间');
    
        let 年月 = Query.utils.asMap(with年月, 'root_id');
        let 时间 = Query.utils.asMap(with时间, 'root_id');
      
        //按照相同的 root_id 字段将 with年月 和 with时间合并成一个大 list
        let documents = [];
        Object.keys(年月).forEach(root_id => {
            // 文档,年月数字,时间数字
            documents.push({
                root_id,
                年月: 年月[root_id]?.number ?? '无法找到对应年月',
                时间: 时间[root_id]?.number ?? 0
            })
        });
    
        let results = [];
        //按照年月来分组,累加计算各个文档中的「时间」
        Query.wrapit(documents).groupby('年月', (date, blocks) => {
            // 累加 blocks 中的时间
            let sum = blocks.reduce((acc, cur) => acc + cur.时间, 0);
            // results.push({
            //     年月: date,
            //     时间: sum
            // });
            dv.addmd(`- ${date}, 总计阅读时间:${sum}`);
        });
        dv.render();
    }
    return query();
    
    

    这个实现的效果是,累加每个「年月」的阅读「时间」字段,然后汇总显示。
    具体的 js 代码看不懂可以喂给 GPT 解读一下。

    image.png

    1 回复
    谢谢大佬是这个意思!!太感谢了!我没看到怎么改成折线图
    mark-j
  • MasterYS

    我还以为他是从“渐进学习”学习的插件里面读取的数据,手动给每个文档做标记也太恐怖了,大佬有没有可能从渐进式读书直接读取现成数据啊,能读到已看分片和总分片就行。再或者直接读取他的进度

    图片.png

    2 回复
  • mark-j

    年月和阅读进度和时间,我是自己写了 quicker,从微信读书同步的;个人觉得还比较方便。只不过要是渐进阅读插件也能归纳进来更好。

    1 回复
  • mark-j

    image.png搭建完是这样的;时间统计不知道怎么改成折线图。

    1 回复
  •     let results = Query.wrapit([]);
        //按照 root_id 字段分组
        Query.wrapit(documents).groupby('年月', (date, blocks) => {
            // 累加 blocks 中的时间
            let sum = blocks.reduce((acc, cur) => acc + cur.时间, 0);
            results.push({
                年月: date,
                时间: sum
            });
            // dv.addmd(`- ${date}, 总计阅读时间:${sum}`);
        });
        dv.addeline(results.pick('年月'), results.pick('时间'));
    
  • MasterYS

    那你这个已经很方便了,就是写了数据进文档头部,其实还好,我主要没微信读书的习惯 😂 还没试过

    1 回复
  • mark-j

    我之前也想过,只用数据库管理,有一次误删过数据库。最后还是觉得这样保险,数据始终存储在文档内,不大可能丢失,等于数据库只是起到汇览的作用。

    1 回复
  • MasterYS

    你说的有道理,但是做好备份应该可以避免啊。还有个问题就是,你想分享的时候怎么办,数据库视图导出的时候好像不能显示吧

    1 回复
  • mark-j 1 评论

    image.png文本都可以显示啊!

    我可能没说清楚,我说的 QueryView 插件这部分,数据库查询出的东西,导出的时候显示不出来
    MasterYS
请输入回帖内容 ...

推荐标签 标签

  • 反馈

    Communication channel for makers and users.

    124 引用 • 916 回帖 • 261 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 374 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    179 引用 • 997 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 1 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 20 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 98 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 732 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 40 回帖
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 11 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 225 回帖 • 136 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • RemNote
    2 引用 • 16 回帖 • 11 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 93 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 676 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 9 关注
  • 安全

    安全永远都不是一个小问题。

    202 引用 • 816 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 154 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 3 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    409 引用 • 3578 回帖