【问题标题】:Can .aggregate() return me a events grouped by day of the month?.aggregate() 可以返回按月份分组的事件吗?
【发布时间】:2018-06-24 14:06:57
【问题描述】:

我在 Mongoose 中有一个 Event 模型:

let eventSchema = new Schema(
  {
    description: { type: String, required: true },
    start_time: { type: Date, required: true },
    end_time: { type: Date, required: true }
  }
);

我正在尝试按月中的某天分组返回它们,以便我可以将它们解析到日历上。我认为使用 .aggregate([])$group 会为我做到这一点。我正在像这样查询我的事件集合:

exports.event_get = (req, res) => {
    let query = Event.aggregate([
        {$group: {
            _id: {
               date : { $dayOfMonth: '$start_time' }
        }}}
    ]).exec(function(err, e) {
        if (err) {
            res.send(err)
        } else {
            res.send(e)
        }
    })
}

这是我得到的回报:

[
  {
    "_id": {
       "date": 5
    }
  },
  {
    "_id": {
       "date": 1
    } 
  }
]

它已成功按日期分组,但我想获取实际对象,而不仅仅是这个。我不应该为此使用.aggregate() 吗? Mongoose/MongoDB 中是否有其他工具可以满足我的需求?

【问题讨论】:

    标签: mongodb mongoose nosql


    【解决方案1】:

    您可以使用$push 将对象添加到分组结果中。每个对象都由$$ROOT 变量表示,因此您的聚合可能如下所示:

    exports.event_get = (req, res) => {
        let query = Event.aggregate([
            {$group: {
                _id: {
                   date : { $dayOfMonth: '$start_time' }                   
                },
                {  objects: { $push: "$$ROOT" } }
            }}
        ]).exec(function(err, e) {
            if (err) {
                res.send(err)
            } else {
                res.send(e)
            }
        })
    }
    

    【讨论】:

    • 您的建议只需稍作修改即可。我必须在_id: {} 之外添加objects : { $push: "$$ROOT" }。否则,我收到一条错误消息,提示 $push 不是有效的运算符。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2019-09-19
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多