收藏
回答

请问数据库中如何对日期作筛选呢?

各位前辈,数据库中有这样一个结构的数据:



现在想按日期来筛选,比如筛选 2019-10-1到2019-10-31 的数据,使用云开发该怎么写呢?我看文档好像都是说的怎么按键值筛选,现在要对key进行筛选该怎么操作呢?

最后一次编辑于  2019-10-31
回答关注问题邀请回答
收藏

2 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2019-10-31

    你硬是要那样设计也可以

    统计2019 - 10

    var _ = db.command,

    $ = _.aggregate


    db.collection('xxx').aggregate()

    .project({

        myNewField: $.objectToArray('$number_available')

    })

    .unwind('$myNewField')

    .match({

        'myNewField.k': /^2019-10/

    })

    .group({

        _id: $.substr(['$myNewField.k', 0, 7]),

        count: $.sum('$myNewField.v')

    })

    .end().then(res => {

        console.log(res)

    })


    ==============

    统计2019

    db.collection('xxx').aggregate()

    .project({

        myNewField: $.objectToArray('$number_available')

    })

    .unwind('$myNewField')

    .match({

        'myNewField.k': /^2019/

    })

    .group({

        _id: $.substr(['$myNewField.k', 0, 4]),

        count: $.sum('$myNewField.v')

    })

    .end().then(res => {

        console.log(res)

    })


    ==============

    按年统计

    db.collection('xxx').aggregate()

    .project({

        myNewField: $.objectToArray('$number_available')

    })

    .unwind('$myNewField')

    .group({

        _id: $.substr(['$myNewField.k', 0, 4]),

        count: $.sum('$myNewField.v')

    })

    .end().then(res => {

        console.log(res)

    })


    2019-10-31
    有用 1
    回复 6
    • low B
      low B
      2019-10-31
      老大,你太强了。我试试
      2019-10-31
      回复
    • low B
      low B
      2019-10-31
      我先看下聚合文档。有问题还得请教你一下。
      2019-10-31
      回复
    • low B
      low B
      2019-10-31
      老大,追问一句,就是最开始这个问题的延伸:程序里需要把某个日期之前的记录找到并删掉,比如找到 2019-11-01日前的记录并删除,该怎么实现呢?聚合能读出来,但怎么定位我还不明白。我原来想的实在不行,直接生成所有日期,每次循环删除1条记录,但感觉这个办法太笨了,肯定有更好的方案,帮我看看呢
      2019-10-31
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-10-31回复low B
      你的数据库设计的有问题,为什么把日期数据作成键呢,没事找事
      2019-10-31
      2
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-10-31回复low B
      表里的2记录
      {_id:'1', year:2019, month:10, day:1, timestamp:1569859200000, val:1}
      {_id:'2', year:2019, month:11, day:1, timestamp:1572537600000, val:2}


      设计成这样不好吗
      删除2019-11-01日前的记录
      db.collection('xxx').where({
            timestamp: _.lt(new Date('2019-11-01').getTime())
      }).remove()
      删除2019年10月11号的记录
      db.collection('xxx').where({
            year: 2019 ,
            month: 10,
            day:1 1
      }).remove()
      删除2019年的记录
      db.collection('xxx').where({
            year: 2019
      }).remove()
      2019-10-31
      2
      回复
    查看更多(1)
  • 叶無魂
    叶無魂
    2019-10-31

    不懂后端,我做的话可能是切割字符串匹配字段

    2019-10-31
    有用
    回复 2
    • low B
      low B
      2019-10-31
      我看了文档,似乎可以用正则查询来实现,再看看
      2019-10-31
      回复
    • low B
      low B
      2019-10-31回复low B
      刚试了,正则查询也只能针对键值进行操作,没办法针对键本身操作
      2019-10-31
      回复
登录 后发表内容
问题标签