mongodump然后删除:不完全相同的记录数

时间:2014-02-14 10:22:20

标签: python mongodb fabric mongodump

我正在使用结构脚本将数据从远程mongodb服务器转储到我的本地计算机,然后我希望从远程计算机中删除该数据。我现在分两步完成,虽然我可以理解,可能会有更多优雅的方法存在几天,我想继续像这样。 这是我作为fab任务运行的python函数的片段

from __future__ import with_statement
from fabric.api import *
from fabric.contrib.console import confirm
import datetime
import dateutil.relativedelta

def dump_mydb():
    print "********************************"
    print "Starting the dump process"
    print "********************************"
    d = datetime.datetime.today()
    d2 = d - dateutil.relativedelta.relativedelta(months=1)
    end_date = datetime.datetime(d2.year, d2.month, d2.day)
    print end_date
    before_time = int(end_date.strftime("%s")) * 1000 

    temp = datetime.datetime.today()
    temp2 = datetime.datetime(temp.year, temp.month, temp.day)
    local_folder = str(temp2).split(" ")[0]
    local("mongodump --host x.x.x.x --port 27017 --collection my_collection --db my_db -q '{fetched_date :{$lte: Date(" + str(before_time) + ")}}'")
    local("mkdir ../dump_files/store/" + local_folder)
    local("cp -r dump ../dump_files/store/" + local_folder)
    local("rm -rf dump")
    print "********************************"
    print "Data before one month from today is dumped at - ../dump_files/store/" + local_folder
    print "********************************"

如果此脚本今天(2014年2月14日,IST)正在执行,那么它将搜索所有具有“fetched_date”(具有日期和时间的正常ISODate对象)的文档小于等于2014-01-14 00:00:00。这个脚本执行得很好。


问题


执行此脚本时,我们可以看到它将X个对象(Documents)转储到本地计算机中。但是当我们在远程mongo shell中运行此查询时

{"fetched_date":{"$lte": ISODate("2014-01-14T00:00:00.00Z")}}

这为我们提供了不同数量的记录。这不仅仅是X.这意味着我们无法删除与此查询匹配的所有记录,因为其中一些记录没有被转储到我的本地计算机中。我不明白这是怎么可能的,因为我在ms中转换相同的日期然后在mongodump上运行查询。

有人可以帮帮我吗?

如果您需要更多信息,请与我们联系。 感谢。

1 个答案:

答案 0 :(得分:2)

我相信你遇到了同样的问题,db.collection.find({...})。count()可能会超额计算。根据{{​​3}}参考文档中的详细信息,如果您在分片群集中,则迁移的记录会重复计算。 (感谢IRC频道上的GothAlice指出这一点!)

如果这是您的问题,您可以使用聚合框架获得准确的计数,该计数应与您从mongodump中看到的计数相匹配:

db.collection.aggregate([
      { $match: {"fetched_date":{"$lte": ISODate("2014-01-14T00:00:00.00Z")}} },
      { $group: { _id: null, count: { $sum: 1 } } }
])