【问题标题】:delete records from mongodb based on condition根据条件从 mongodb 中删除记录
【发布时间】:2016-02-19 23:13:13
【问题描述】:

您好,我是 mongodb 新手,由于我们收集了大量数据,我不知道如何有效地实现以下目标

我想删除那些超过 6 个月的文件 但同时我想为每个 al_object_id 保留最新的 5 条记录,即使有超过 6 个月的记录。

+--------+---------------------+--------------+
| al_id  |       al_date       | al_object_id |
+--------+---------------------+--------------+
| 224917 | 2012-01-01 00:00:00 |            1 |
| 224918 | 2012-01-02 00:00:00 |            1 |
| 224919 | 2012-01-03 00:00:00 |            1 |
| 224920 | 2012-01-04 00:00:00 |            1 |
| 224921 | 2012-01-05 00:00:00 |            1 |
| 224922 | 2012-01-06 00:00:00 |            1 |
| 224923 | 2012-01-07 00:00:00 |            1 |
| 224925 | 2016-01-01 00:00:00 |          222 |
| 224926 | 2016-01-02 00:00:00 |          222 |
| 224927 | 2016-01-03 00:00:00 |          222 |
| 224928 | 2016-01-04 00:00:00 |          222 |
| 224929 | 2016-01-05 00:00:00 |          222 |
| 224930 | 2016-01-06 00:00:00 |          222 |
| 224931 | 2016-01-07 00:00:00 |          222 |
| 224932 | 2016-01-08 00:00:00 |          222 |
| 224933 | 2016-01-09 00:00:00 |          222 |
| 224934 | 2016-01-10 00:00:00 |          222 |
| 224935 | 2012-01-11 00:00:00 |          222 |
| 224936 | 2012-01-12 00:00:00 |          222 |
| 224937 | 2012-01-13 00:00:00 |          222 |
| 224938 | 2012-01-14 00:00:00 |          222 |
| 224939 | 2012-01-15 00:00:00 |          222 |
| 224940 | 2012-01-16 00:00:00 |          222 |
+--------+---------------------+--------------+

如果对象 al_object_id = 1 的记录在过去 6 个月内没有新更新,所以我想保留最新的 5 个更新并删除其他更新 至于 al_object_id = 222,过去 6 个月有更新,所以我想删除超过 6 个月的记录。所以预期的输出如下

+--------+---------------------+--------------+
| al_id  |       al_date       | al_object_id |
+--------+---------------------+--------------+
| 224923 | 2012-01-07 00:00:00 |            1 |
| 224922 | 2012-01-06 00:00:00 |            1 |
| 224921 | 2012-01-05 00:00:00 |            1 |
| 224920 | 2012-01-04 00:00:00 |            1 |
| 224919 | 2012-01-03 00:00:00 |            1 |
| 224934 | 2016-01-10 00:00:00 |          222 |
| 224933 | 2016-01-09 00:00:00 |          222 |
| 224932 | 2016-01-08 00:00:00 |          222 |
| 224931 | 2016-01-07 00:00:00 |          222 |
| 224930 | 2016-01-06 00:00:00 |          222 |
| 224929 | 2016-01-05 00:00:00 |          222 |
| 224928 | 2016-01-04 00:00:00 |          222 |
| 224927 | 2016-01-03 00:00:00 |          222 |
| 224926 | 2016-01-02 00:00:00 |          222 |
| 224925 | 2016-01-01 00:00:00 |          222 |
+--------+---------------------+--------------+

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    一种方法是使用aggregatefindAndModify

    您可以执行以下操作:

    1. 按日期降序排列。这可以在aggregate 方法的$sort 阶段完成。
    2. 在同一aggregate 方法中使用$group 阶段按al_object_id 分组。在此阶段,使用$push 运算符为特定al_object_id 形成日期数组。这应该会为您提供一组 al_object_ids 以及每个日期的日期。
    3. 在上述结果中使用另一个$group 阶段,使用$slice 运算符以相同的aggregate 方法找到第五个al_date
    4. 现在您知道,从上述聚合方法的输出中,日期(比如 dateThresh)应该在哪些元素之前被删除,您可以使用 findAndModify 方法通过循环遍历 aggregate 来删除这些文档结果。另外,不要忘记处理这个:

      if dateThresh < dateSixMonthsAgo:
        remove_all_elements_before_dateThresh
      else:
        remove_all_elements_before_dateSixMonthsAgo
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 2022-01-19
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多