【问题标题】:Group and count dates matching only the day excluding time in mongoDB using mongoose使用 mongoose 在 mongoDB 中对日期进行分组和计数,仅匹配不包括时间的日期
【发布时间】:2026-01-27 13:55:01
【问题描述】:

我有一个像这样的文件links

{
    "_id": "60043f2e10a0f677742b3997",
    "visit_count": 1,
    "password": null,
    "password_protected": false,
    "description": null,
    "analytics": [
        "60043fd7443aee6a585ca0d6",
        "60043563a6b1d440183a1b63"
    ],
    "alias": "m218",
    "short_url": "https://reduced.me/m218",
    "long_url": "https://test.com",
    "created_at": "2021-01-17T13:44:14.887Z",
    "updated_at": "2021-01-17T13:47:03.814Z",
    "__v": 1
}

还有另一个文档analytics 像这样

{
    "_id": "60043fd7443aee6a585ca0d6",
    "os": {
        "windows": true,
        "linux": false,
        "mac": false,
        "android": false
    },
    "browser": {
        "opera": false,
        "ie": false,
        "edge": false,
        "safari": false,
        "firefox": true,
        "chrome": false
    },
    "details": {
        "os": "Windows 10.0",
        "browser": "Firefox",
        "version": "84.0",
        "platform": "Microsoft Windows",
        "source": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
    },
    "visit_date": "2021-01-17T13:47:03.796Z"
    "__v": 0
},

{
    "_id": "60043563a6b1d440183a1b63",
    "os": {
        "windows": true,
        "linux": false,
        "mac": false,
        "android": false
    },
    "browser": {
        "opera": false,
        "ie": false,
        "edge": true,
        "safari": false,
        "firefox": false,
        "chrome": false
    },
    "details": {
        "os": "Windows 10.0",
        "browser": "Edge",
        "version": "87.0.664.75",
        "platform": "Microsoft Windows",
        "source": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
    },
     "visit_date": "2021-01-17T13:02:27.663Z",
    "__v": 0
}


我正在从analytics 文档中填充links 文档中的analytics 数组。我想要实现的是从每个analytics 文档中获取visit_date 字段的对象,并仅通过day-month-year 计算与它们匹配的所有日期的数量,我不想匹配时间。

所以我正在寻找的最终输出是这样的


{
    //rest of the document fields

"visit_date": {
    "2021-01-17":2
      //and so on dates
    }

}

这里的"2021-01-17":2 来自两个analytics 文档,只有日期中的d-m-y 值匹配。其中2 是匹配日期的数量,2021-01-17 是匹配日期

任何帮助将不胜感激。

【问题讨论】:

    标签: mongodb date mongoose


    【解决方案1】:

    试试lookup with pipeline

    • $lookup 带有分析,将分析 ID 传递给 let
    • $match 分析 ID 条件
    • $group by visit_date, $substr 从 visit_date 获取日期
    • $project 显示必填字段和 make,k(key) 和 v(value) 格式
    • $addFields,使用 $arrayToObjectvisit_date 数组转换为对象
    db.links.aggregate([
      {
        $lookup: {
          from: "analytics",
          let: { analytics: "$analytics" },
          pipeline: [
            { $match: { $expr: { $in: ["$_id", "$$analytics"] } } },
            {
              $group: {
                _id: { $substr: ["$visit_date", 0, 10] },
                v: { $sum: 1 }
              }
            },
            {
              $project: {
                _id: 0,
                k: "$_id",
                v: 1
              }
            }
          ],
          as: "visit_date"
        }
      },
      { $addFields: { visit_date: { $arrayToObject: "$visit_date" } } }
    ])
    

    Playground

    【讨论】:

    • 这适用于给定的情况,但它不显示其他日期的计数。我向analytics 添加了一个对象,日期为"2021-01-18",但这个解决方案仍然只显示“2021-01-17”:2
    • 确保_id 应该在分析集合中可用,请参阅我在playground 中添加了2021-01-18 的新文档