您好我是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 |
+--------+---------------------+--------------+
答案 0 :(得分:1)
执行此操作的一种方法是使用aggregate
和findAndModify
。
您可以执行以下操作:
$sort
方法的aggregate
阶段完成。$group
方法中的aggregate
阶段按al_object_id
进行分组。在此阶段,使用$push
运算符为特定al_object_id
形成日期数组。这应该为您提供一系列al_object_id
以及每个日期。$group
方法在上述结果中使用另一个aggregate
阶段,使用al_date
运算符查找第五个$slice
。现在你知道,从上面的聚合方法的输出中,应该删除元素之前的日期(比如dateThresh),你可以使用findAndModify
方法通过循环删除这些文档超过aggregate
结果。另外,不要忘记处理这个问题:
if dateThresh < dateSixMonthsAgo:
remove_all_elements_before_dateThresh
else:
remove_all_elements_before_dateSixMonthsAgo