Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mongodump然后删除:记录数不完全相同_Python_Mongodb_Fabric_Mongodump - Fatal编程技术网

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

Python mongodump然后删除:记录数不完全相同,python,mongodb,fabric,mongodump,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 da

我正在使用结构脚本将数据从远程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)执行此脚本,则它将搜索“获取_日期”(日期和时间均存在的正常ISODate对象)小于等于2014-01-14 00:00:00的所有文档。这个脚本执行得很好


问题


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

{"fetched_date":{"$lte": ISODate("2014-01-14T00:00:00.00Z")}}
这给了我们不同数量的记录。这比X大。这意味着我们不能删除所有与此查询匹配的记录,因为其中一些记录没有被转储到我的本地计算机中。我不明白这怎么可能,因为我正在ms中转换相同的日期,然后在mongodump上运行查询

有人能帮我吗

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

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

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

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

对数据库中的记录进行计数很难做到准确和快速。采取快捷方式,这些快捷方式确实会产生错误的计数。在分片情况下,计数将等于或高于实际记录数。在其他情况下(例如,正在进行多次更新或多次删除),计数可能以不同的方式错误。给定的聚合将是准确的,但前提是数据处于静止状态(无更新/插入)。