3

我正在尝试使用 pymongo 从远程 mongo 实例中克隆一个集合,从文档中克隆一个集合需要cloneCollection命令,

{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> } }

在 pymongo 中运行此命令,我需要将命令的附加参数指定为 kwargs,如下所示:

db.command("cloneCollection","db_name.collection_name", from = "localhost:27017")

但是由于from是python中的保留关键字,我不能将其用作关键字。另一种方法是将命令作为 python dict 传递,如下所示:

db.command({"cloneCollection":"db_name.collection_name", "from":"localhost:27017"})

但是在这种情况下,订单不会保留,我收到此错误

pymongo.errors.OperationFailure: command {'from': 'localhost:27017', 'cloneCollection': 'db_name.collection_name'} failed: no such cmd: from
4

2 回答 2

2

认为我可以使用bson.son.SON来创建一个 SON 对象(一个 dict 的子类,它保持键的顺序),当我们将参数或 python dict 传递给 pymongo 命令时,pymongo 也在内部执行此操作,

from bson.son import SON
db.command(SON([("cloneCollection","db_name.collection_name"), ("from","localhost:27017")]))
于 2014-01-31T08:32:26.420 回答
2

根据 pymongo 使用字典的方式,您可能可以使用OrderedDict(来自内置的集合模块)。这仅适用于 python 2.7,但有可用于 python 2.4 及更高版本的反向端口。

在这种情况下,您可以执行以下操作:

from collections import OrderedDict
config = OrderedDict((
    ("cloneCollection", "db_name.collection_name"),
    ("from", "localhost:27017"),
))
db.command(config)
于 2014-01-31T09:19:26.753 回答