使用 pymongo 沿集合的文档多次更新密钥



我在一个集合中有很多文档。 集合中每个文档的结构如下所示:

{
"_id" : ObjectId(....),
"valor" : {
"AB" : {
"X" : 0.0,
"Y" : 142.6,
},
"FJ" : {
"X" : 0.2,
"Y" : 3.33
....

该馆藏目前有大约 200 个文档,我注意到valor中的一个密钥名称错误。在这种情况下,我们将说"FJ"在集合的所有文档中应为"JOF"。

我很确定可以使用pymongo的update功能更改所有文档中的密钥。我面临的问题是,当我访问可用的在线文档时,https://docs.mongodb.com/v3.0/reference/method/db.collection.update/只解释了如何更改值(我想保持当前状态并仅更改键(。

这是我尝试过的:

def multi_update(spec_key,key_updte):
rdo=col.update((valor.spec_key),{"$set":(valor.key_updte)},multi=True)
return rdo
print(multi_update('FJ','JOF'))

但输出name 'valor' is not defined.我想我会使用 valor.specific_key 来访问相应的 json

如何仅沿集合的文档更新密钥?

你有两个问题。首先,valor不是Python代码中的标识符,而是MongoDB文档的字段名称。你需要在Python中用单引号或双引号引出它,以便使其成为字符串并在PyMongo更新表达式中使用它。

你的第二个问题是,MongoDB的update命令不允许你将一个字段设置为另一个字段的值,也不允许您重命名字段。但是,您可以使用带有$project阶段的aggregate命令重塑集合中的所有文档,并使用$out阶段将结果存储在第二个集合中。

这里有一个完整的示例:

db = MongoClient().test
collection = db.collection
collection.delete_many({})
collection.insert_one({
"valor" : {
"AB" : {
"X" : 0.0,
"Y" : 142.6,
},
"FJ" : {
"X" : 0.2,
"Y" : 3.33}}})
collection.aggregate([{
"$project": {
"valor": {
"AB": "$valor.AB",
"FOJ": "$valor.FJ"
}
}
}, {
"$out": "collection2"
}])

这是危险的部分。首先,检查"collection2"是否具有所需的形状所需的所有文档。然后:

collection.drop()
db.collection2.rename("collection")
import pprint
pprint.pprint(collection.find_one())

最新更新