NodeJS Mongoose聚合以过滤数据

klsxnrf1  于 2023-03-12  发布在  Node.js
关注(0)|答案(3)|浏览(125)

我尝试使用聚合来获得本月数据的计数,但它没有给我找到匹配,即使我在DB中有数据。

var month = new Date().getMonth();
    var year = new Date().getFullYear();
    const start = new Date(year, month, 1).setHours(0, 0, 1);
    const end = new Date(year, month + 1, 0).setHours(23, 59, 59);

        const data = await verificationModel.aggregate([
            {
            $match:{'status':{ $gt: 3, $lt:7},'createdAt': { $gt:start, $lt:end},'fename': { $ne: null }}
            },
            {
            $facet: {
              "categorizedBycasecount": [
                {
                  $unwind: "$fename"
                },
                {
                  $sortByCount: "$fename"
                },
                {$limit:5},
              ]
            }
            }
        ]);

创建了一个蒙戈Playground它在那里工作link
如果删除createdAt,则过滤器数据可见

uyto3xhc

uyto3xhc1#

我建议使用像moment.js,Luxon或Day.js这样的Date库,然后简单地如下所示:

db.collection.aggregate([
   {
      $match: {
         "createdAt": {
            $gt: DateTime.now().startOf('month').toJSDate(),
            $lte: DateTime.now().plus({ months: 1 }).endOf('day').toJSDate()
         }
      }
   },
   { $sortByCount: "$name" },
   { $limit: 5 },
   {
      $group: {
         _id: null,
         categorizedBycasecount: { $push: "$$ROOT" }
      }
   }
])

只有一个元素的$facet阶段对我来说没有多大意义,我更喜欢$group

jxct1oxe

jxct1oxe2#

除了开始日期和结束日期之外,其他一切都很好
计算的开始日期和结束日期为字符串格式,如下所示

var month = new Date().getMonth();
    var year = new Date().getFullYear();
    const start = new Date(year, month, 1).setHours(0, 0, 1);
    const end = new Date(year, month + 1, 0).setHours(23, 59, 59);

console.log({start, end})

您可以更新代码以获得mongodb createdAt字段所需的格式

var month = new Date().getMonth();
    var year = new Date().getFullYear();
    const start = new Date(year, month, 1).setHours(0, 0, 1);
    const end = new Date(year, month + 1, 0).setHours(23, 59, 59);
    console.log(new Date(start).toISOString())
    console.log(new Date(end).toISOString())
xzlaal3s

xzlaal3s3#

var month = new Date().getMonth();
 var year = new Date().getFullYear();
 const start = new Date(new Date(year, month, 1).setHours(0, 0, 1));
 const end = new Date(new Date(year, month + 1, 0).setHours(23, 59, 59));

这起作用了。

相关问题