【问题标题】:Mongoose: query for a list of yearsMongoose:查询年份列表
【发布时间】:2019-01-22 21:12:30
【问题描述】:

我已经定义了一个请求模式:

var RequestSchema = new Schema({
    date: {
        type: Date,
        required: true,
        default: Date.now
    },
    status: {
        type: String,
        enum: ['Open', 'Closed'],
        required: true,
        default: 'Open'
    }
});

考虑以下文件:

{ status: 'Closed',
  date: 2018-08-15T22:43:55.073Z,
  _id: 5b61b3b8de9c7252efb77238,
  __v: 0 }
{ status: 'Open',
  date: 2019-08-15T22:43:55.073Z,
  _id: 5b61b3b8de9c7252efb77239,
  __v: 0 }

我想要实现的目标很简单,但我似乎无法让它发挥作用。我需要一份包含所有请求年份的列表,例如,如果我们考虑上面显示的文件,我希望得到以下列表:

['2018', '2019']

我是 webdev 世界的新手,所以我能想到的最直接的解决方案如下:

var years = [];

for (var i = 0; i < 100; i++) {
    var start = new Date(2018 + i, 1, 1);
    var end = new Date(2018 + i, 12, 31);

    Request.findOne({ date: { $gte: start, $lt: end } })
           .then(function(request) {
               if (request) {
                   years.push(2018 + i);
               }
           });
}

res.json(years);

很明显,它不会起作用,因为变量 years 不会改变,因为 years.push() 是从回调函数执行的。我以为我可以找到解决方法,但直到现在我都找不到。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript node.js express mongoose callback


    【解决方案1】:

    在 mongoDB 中为您执行此操作的查询将是这样的:

    db.getCollection('<YourCollectionName>').aggregate([
      { $project: { _id: 0, year: { $year: "$date" }}},
      { $group: { "_id": null, years: { $push: "$year" } } }
    ])
    

    它会给你这样的结果:

    {
        "_id" : null,
        "years" : [2018, 2019]
    }
    

    现在你有了 years 数组。

    在您的查询中,您正在执行findOne,但您需要聚合才能获得按年分组的类型结果。我相信还有其他方法可以通过 MongoDB 查询获得结果,但这应该可以帮助您入门。

    因此,您只需将其转换为猫鼬......应该是以下几行:

    const aggregate = Model.aggregate([
      { $project: { _id; 0, year: { $year: "$date" } } },
      { $group: { "_id": null, years: { $push: "$year" } } }
    ]);
    

    还没有测试过,所以谨慎行事:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多