PyMongo - 将属性中的所有值设置为小写

时间:2017-12-30 04:44:00

标签: python mongodb pymongo

我正在清理数据集,并且具有字段性别。在此字段中,有一些条目,例如男性,男性和男性。要解决此问题,我正在尝试使用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"}}}])

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您正在使用聚合查询,它将返回结果,并将所有update字段转换为小写。如果您希望更新字段的值,则必须使用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}}) 查询。

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

std::ostream& operator<<(std::ostream& out, std::chrono::system_clock::time_point tp)
{
    return out << tp.time_since_epoch().count();
}

答案 2 :(得分:1)

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

中所述自动替换该集合

另一个选择是使用update操作仅更新包含错误大小写的文档。