根据条件从mongodb中删除记录

时间:2016-02-19 13:22:36

标签: mongodb

您好我是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 |
+--------+---------------------+--------------+

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用aggregatefindAndModify

您可以执行以下操作:

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

    if dateThresh < dateSixMonthsAgo:
      remove_all_elements_before_dateThresh
    else:
      remove_all_elements_before_dateSixMonthsAgo