【问题标题】:Insert or Update Documents in MongoDB from a CSV using Python使用 Python 从 CSV 插入或更新 MongoDB 中的文档
【发布时间】:2021-07-13 19:04:42
【问题描述】:

我正在尝试根据我在 CSV 中的信息在 MongoDB 中插入/更新文档。如果 CSV customer_id 的第一个标题不存在,那么它应该创建一个新文档,但如果它确实存在,那么它应该只更新文档中的所有值。

我构建了用于查找 customer_id 的脚本,如果它不存在,那么它将创建新文档,但无法让更新部分正常工作。

您是否必须指定每个需要更新的标头,或者是否有更有效的更新方法,即在以后添加新标头时利用 CSV 中的标头,这样脚本就不必更新以指定新的标题:

import csv
from pymongo import MongoClient
  
conn = MongoClient('localhost', 27017)

db = conn.shipping
collection = db.sales

file = csv.reader(open("shipping_list.csv"), delimiter=',')

header = ["customer_id", "customer_name", "sales_rep", "purchase_date", "region", "purchase_price", "shipping_status", "products_purchased"]

for each in file:
    if collection.count_documents({ 'customer_id': each[0] }) == 0:
        row={}
        for n in range(0,len(header)):
            row[header[n]] = each[n]
                 
        collection.insert_one(row)
    else:
        row={}
       for n in range(0,len(header)):
            row[header[n]] = each[n]
                 
        collection.update({'customer_id': each[0]}, row)

【问题讨论】:

  • 你坚持用python吗?如果没有,请查看mongoimport
  • 老实说,我没有考虑过使用 Python 之外的东西。从我刚刚看到的使用 mongoimport 看起来像:mongoimport -d shipping -c sales --upsert --upsertFields customer_id --file shipping_list.csv
  • 我认为您错过了选项--mode=upsert --headerline --type=csv,您可以使用选项--columnsHaveTypes 调整purchase_date 的日期格式。查看文档页面底部的示例。

标签: python python-3.x mongodb mongodb-query pymongo


【解决方案1】:

如果你想使用 pymongo,你可以使用 pandas 和 read_csv() 让你的代码更简单。您只需指定键列,这样您就可以在不更改代码的情况下添加更多列。如果要将日期存储为“正确”日期而不是字符串,请使用 parse_dates

import pandas as pd
from pymongo import MongoClient

db = MongoClient()['mydatabase']

key = 'customer_id'
df = pd.read_csv('csv_pandas_mongo.csv', parse_dates=['purchase_date'])

for row in df.to_dict('records'):
    db.mycollection.update_one({key: row.get(key)}, {'$set': row}, upsert=True)

【讨论】:

  • 这对我正在寻找的东西有用。我确实使用 Pymongo 和 mongoimport 推荐的方法进行了测试。 Python 似乎解析大型 CSV 文件并更新 MONGODB 比使用 mongoimport 更快。
猜你喜欢
  • 2017-03-07
  • 2018-04-05
  • 2014-09-08
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多