【问题标题】:Find all n days documents in MongoDB在 MongoDB 中查找所有 n 天的文档
【发布时间】:2022-02-03 22:49:53
【问题描述】:

我一直在寻找过去 n 天的数据。例如,我只想获取最近 3 天的所有数据。在 StackOverflow 中实施另一个问题的解决方案后,我没有得到所有文档。我只得到一份文件。如果我想查看过去 3 天的文档,它只会显示某一天的数据。

这是我的架构:

dayWiseClicks: [
      {
        date: {
          type: Date,
        },
        dailyClicks: {
          type: Number,
          default: 0,
        },
      },
    ],

这是我执行查询之前的数据:

{
    "_id": {
      "$oid": "61eff4bacf8335c7013f8065"
    },
    "dayWiseClicks": [
      {
        "dailyClicks": 3,
        "_id": {
          "$oid": "61eff5db5dca56cae4530db2"
        },
        "date": {
          "$date": "2022-01-24T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 4,
        "_id": {
          "$oid": "61eff60b5dca56cae4530db6"
        },
        "date": {
          "$date": "2022-01-25T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 2,
        "_id": {
          "$oid": "61eff64a5dca56cae4530dba"
        },
        "date": {
          "$date": "2022-01-26T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 7,
        "_id": {
          "$oid": "61f60ce51f14b01f8f5be936"
        },
        "date": {
          "$date": "2022-01-29T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 11,
        "_id": {
          "$oid": "61f7b1d3931b0f8bc33703d4"
        },
        "date": {
          "$date": "2022-01-30T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 8,
        "_id": {
          "$oid": "61f8bdf63cc3a51b72474cb9"
        },
        "date": {
          "$date": "2022-01-31T18:00:00.000Z"
        }
      },
      {
        "dailyClicks": 7,
        "_id": {
          "$oid": "61fba7159692624ce8ea04d6"
        },
        "date": {
          "$date": "2022-02-02T18:00:00.000Z"
        }
      }
    ],
    
  }

理论上,如果我想查看最近 3 天的数据。它应该显示 1 月 31 日,2 月 2 日的数据,但它只显示 1 月 31 日的数据。

这是我得到的数据:

{
    "message": "Url By ID",
    "result": {
        "_id": "61eff4bacf8335c7013f8065",
        "dayWiseClicks": [
            {
                "dailyClicks": 8,
                "_id": "61f8bdf63cc3a51b72474cb9",
                "date": "2022-01-31T18:00:00.000Z"
            }
        ]
    }
}

这是我的代码:

exports.lastNDays = async (req, res) => {
  try {
    const url = await URL.findById(
      { _id: req.params.id },
      {
        dayWiseClicks: {
          $elemMatch: {
            date: {
              $gte: moment().add(-3, "days"),
            },
          },
        },
      }
    )
    return res.status(200).json({
      message: "Url By ID",
      result: url,
    });
  } catch (error) {
    return res.status(404).json({ error: error.message });
  }
};

谁能告诉我到底哪里出错了?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    aggregation->$filter 选项似乎更适合任务,例如:

     db.collection.aggregate([{
    $match: {
      "_id": {
        "$oid": "61eff4bacf8335c7013f8065"
         }
        }
      },
      {
       $project: {
       dayWiseClicks: {
        $filter: {
          input: "$dayWiseClicks",
          as: "item",
          cond: {
            $gte: [
              "$$item.date",
              {
                "$date": "2022-01-30T18:00:00.000Z"
              }
            ]
           }
          }
         }
        }
       }
     ])
    

    解释:

    1. $match 单个文档 by _id
    2. $只过滤大于或等于某个日期的 dayWiseClicks。

    playground

    【讨论】:

    • 如何为特定 ID 执行此操作?因为我正在使用 findByID 方法查找最近 N 天的数据。
    • 更新了答案以包含 $match 阶段以仅适用于具有特定 _id 的文档
    【解决方案2】:

    如果您的 dayWiseClicks 按自然日期升序排列(而且看起来是这样),那么一般可以使用 $slice 来捕获任何日期序列的最后 3 天:

    db.foo.aggregate([
        {$addFields: {dayWiseClicks: {$slice: ["$dayWiseClicks", -3]}}}
    ]);
    

    您可以在前面的答案中详细说明 $match 阶段。

    注意:期待已久的sortArray 运算符将在 v5.4 中出现(现在在 MongoDB Atlas 5.2 快速版本中可用)。如果dayWiseClicks 没有按日期顺序排列,那么以这种方式查找最后 3 个日期非常简单:

    db.foo.aggregate([
        {$addFields: {dayWiseClicks: {$slice: [{$sortArray:{input: "$dayWiseClicks", sortBy: {"date":1}}, -3]}}}
    ]);
    

    类似地,以降序获取最后 3 个日期:

    db.foo.aggregate([
        {$addFields: {dayWiseClicks: {$slice: [{$sortArray:{input: "$dayWiseClicks", sortBy: {"date":-1}}, 3]}}}
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多