1

我正在使用结构脚本将数据从远程 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 个对象(文档)转储到我的本地计算机中。但是当我们在远程 mongo shell 中运行这个查询时

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

这给了我们不同数量的记录。这比 X 多。这意味着我们不能删除与该查询匹配的所有记录,因为其中一些记录没有被转储到我的本地计算机中。我不明白这怎么可能,因为我以毫秒为单位转换相同的日期,然后在 mongodump 运行查询。

有人可以帮帮我吗?

如果您需要更多信息,请告诉我。谢谢。

4

1 回答 1

2

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

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

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