代码之家  ›  专栏  ›  技术社区  ›  6c656c

猫鼬:查询年份列表

  •  0
  • 6c656c  · 技术社区  · 6 年前

    我定义了一个请求架构:

    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);
    

    年。推() 从回调函数执行。我以为我能找到工作,但直到现在我还是找不到。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akrion    6 年前

    在mongoDB中为您执行此操作的查询如下:

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

    它会给你这样的结果:

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

    在你的询问中 findOne 但您需要聚合来获得按年份类型分组的结果。我确信有其他方法可以通过MongoDB查询得到结果,但这应该可以让您开始。

    所以你只需要把它变成猫鼬。。。应该是以下几行:

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

    尚未测试,请谨慎操作:)