簡體   English   中英

貓鼬:查詢年份列表

[英]Mongoose: query for a list of years

我已經定義了一個請求架構:

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.push改變()從一個回調函數中執行。 我以為可以找到工作了,但是直到現在我還找不到。

任何幫助,將不勝感激!

在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" } } }
]);

尚未測試過,請謹慎操作:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM