Py学习  »  MongoDB

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

Gaurav • 4 年前 • 712 次点击  

这就是我收藏的样子。

{ "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
 
712 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Akrion
Reply   •   1 楼
Akrion    5 年前

改变你 $match 章节到:

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

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