社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

mongodb$match在聚合查询中不能与$group一起使用

Gaurav • 5 年前 • 1539 次点击  

这就是我收藏的样子。

{ "name" : "Lorem", "createdate" : ISODate("2018-09-12T04:02:41.208Z")},
{ "name" : "Impusom", "createdate" : ISODate("2018-09-12T04:02:41.208Z")}
{ "name" : "Lorem", "createdate" : ISODate("2018-11-01T04:02:41.208Z")}
{ "name" : "Damut", "createdate" : ISODate("2018-11-12T04:02:41.208Z")}
{ "name" : "Remetat", "createdate" : ISODate("2019-01-01T04:02:41.208Z")}

我想提取不同的 createdate 值以便在日历小部件上标记它们。我想忽略时间。

这是我目前正在使用的管道。

db.mycollection.aggregate({
    '$project': {
      'y': {
        '$year': '$createdate'
      },
      'm': {
        '$month': '$createdate'
      },
      'd': {
        '$dayOfMonth': '$createdate'
      }
    }
  }, {
    '$group': {
      '_id': {
        'year': '$y',
        'month': '$m',
        'day': '$d'
      }
    }
  }, {
    '$sort': {
      '_id.year': 1,
      '_id.month': 1,
      '_id.day': 1
    },
  })

结果是这样的

{
    "_id" : {
        "year" : 2019,
        "month" : 1,
        "day" : 1
    }
},
{
    "_id" : {
        "year" : 2018,
        "month" : 11,
        "day" : 12
    }
},
{
    "_id" : {
        "year" : 2018,
        "month" : 11,
        "day" : 1
    }
},
{
    "_id" : {
        "year" : 2018,
        "month" : 9,
        "day" : 12
    }
}

我希望改进查询并将数据限制在特定年份 . 例如2018

因此,我以前尝试过添加匹配条件 $project

{ '$match': { "createdate":{ "$gte": ISODate("2017-12-31T18:30:00.000Z"), "$lt": ISODate("2018-12-31T18:30:00.000Z") } }
},

结果仅限于2018年,但随后 $group 停止工作,因此我得到重复的日期记录。

我试着移动 $match 期权后 $sort 允许 美元集团 工作但不适用 美元匹配 条件。

我真的很感激朝着正确的方向轻轻推一下。

更新---

所以上面的$match条件查询在mongoplayground.net中工作。 但我的Mongoose代码没有。

    const pipeline = [{
        "$match": {
          "createdate": {
            "$gte": moment().startOf('year'),
            "$lt": moment().endOf('year'),
          }
        }
      },{
        '$project': {
          'y': {
            '$year': '$createdate'
          },
          'm': {
            '$month': '$createdate'
          },
          'd': {
            '$dayOfMonth': '$createdate'
          }
        }
      }, {
        '$group': {
          '_id': {
            'year': '$y',
            'month': '$m',
            'day': '$d'
          }
        }
      }, {
        '$sort': {
          '_id.year': 1,
          '_id.month': 1,
          '_id.day': 1
        },
      }];


Collection.aggregate(pipeline, (err, dates) => { res.json({ data: dates });  });

响应返回空数组。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37878
 
1539 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Akrion
Reply   •   1 楼
Akrion    6 年前

改变你 $match 章节到:

"$match": {
  "createdate": {
    "$gte": moment().startOf('year').toDate(),
    "$lt": moment().endOf('year').toDate(),
  }
}

看看这是否有帮助。我不认为 moment 将用作有效的日期参数