PyMongo - 将属性中的所有值设置为小写[重复]

Posted

技术标签:

【中文标题】PyMongo - 将属性中的所有值设置为小写[重复]【英文标题】:PyMongo - Setting all values in an attribute to lowercase [duplicate] 【发布时间】:2018-06-10 09:24:00 【问题描述】:

我正在清理一个数据集,并且有一个字段性别。在该字段中,有男性、男性和男性等条目。为了解决这个问题,我正在尝试使用 pymongo 更新我的 MongoDB 数据库。

在数据库中,Gender属性为Gender(前面是大写的G)

我的代码目前如下所示:

import pymongo
from pymongo import MongoClient


db_info = 
    'db_name': 'MentalHealth',
    'collection_name': 'MentalHealth',


if __name__ == "__main__":

    mongo_client = MongoClient()
    mongo_db = mongo_client[db_info['db_name']]
    mongo_collection = mongo_db[db_info['collection_name']]

    #normalize to lowercase
    mongo_collection.aggregate([ '$project':  'Gender': '$toLower':"$Gender"])

代码运行没有问题,但数据库没有更新,我不确定代码有什么错误。任何帮助将不胜感激。谢谢!!!

【问题讨论】:

您正在执行aggregate,它将返回所有Gender 字段转换为小写。更新记录使用update 你快到了。你有很多选择。查看我对可能重复的回答 @sstyvane 这是错误的重复。 OP 没有使用另一个字段的值更新Gender 字段,而是使用相同的字段。 另一个字段或相同字段,过程仍然相同,这就是为什么我们说“可能重复”如果不是这种情况我会回答,因为除了这个@,这里的答案都没有用987654322@ 提到了$out 管道阶段运算符。 @GarbageCollector 你错过了这里的重点。答案不仅适用于 OP。我提出了issue once on meta 并给出了教坏习惯的答案,请参阅comment,但我想您不想看到我指出的内容,那是您的选择@GarbageCollector 【参考方案1】:

Mongodb 聚合操作处理数据记录并返回计算结果。它无法更新任何集合。您可以像这样更新相同的内容

db.mongo_collection.find().forEach(function(doc) 
    db.mongo_collection.update(
         "_id": doc._id ,
         "$set":  "Gender": doc.Gender.toUpperCase()  
    );
);

【讨论】:

这个问题被标记为pymongo 但是你的解决方案是使用js 感谢您的帮助。正如 Garbage Collector 所说,这不是在 python 中,而是在 js 中,但我感谢您的帮助!【参考方案2】:

您使用的聚合框架仅执行查询。要实际执行写入,您需要使用$out 阶段将结果转储到集合中。 如果您选择现有的集合,则该集合将按照https://docs.mongodb.com/manual/reference/operator/aggregation/out/#pipe._S_out 中的说明自动替换

另一种选择是使用update 操作仅更新大小写不正确的文档。

【讨论】:

【参考方案3】:

您正在使用聚合查询,它将返回所有Gender 字段转换为小写的结果。如果您想更新某个字段的值,您必须使用 update 查询。

由于您使用 pymongo 来查询您的文档,因此您的代码应该是这样的

import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId

db_info = 
    'db_name': 'MentalHealth',
    'collection_name': 'MentalHealth'


if __name__ == "__main__":

     mongo_client = MongoClient()
     mongo_db = mongo_client[db_info['db_name']]
     mongo_collection = mongo_db[db_info['collection_name']]

     for doc in mongo_collection.find(no_cursor_timeout=True):
            pk = ObjectId(str(doc.get("_id")))
            g = doc.get('Gender')
            if g:
               g = g.lower()
               mongo_collection.update("_id": pk, "$set":"Gender":g) 

【讨论】:

上述答案中的我的comment 也适用于您的答案

以上是关于PyMongo - 将属性中的所有值设置为小写[重复]的主要内容,如果未能解决你的问题,请参考以下文章

CSS---文本相关属性

pymongo 用它的子字符串值更新字段集合中的所有文档

如何从 pymongo 字段中的所有值创建一个列表?

如何使用 pymongo 在 mongodb 中重命名父字段名称和嵌套字段值?

LitElement属性

IIS URL 将模块 url 重写为小写