如何使用 pymongo 将集合转储到 json 文件

Posted

技术标签:

【中文标题】如何使用 pymongo 将集合转储到 json 文件【英文标题】:How to dump a collection to json file using pymongo 【发布时间】:2018-08-15 14:53:30 【问题描述】:

我正在尝试将集合转储到 .json 文件,但在查看 pymongo 教程后,我找不到任何与之相关的内容。

教程链接:https://api.mongodb.com/python/current/tutorial.html

【问题讨论】:

docs.mongodb.com/manual/reference/program/mongoexport 这能回答你的问题吗? PyMongo/Mongoengine equivalent of mongodump 【参考方案1】:

接受的解决方案生成无效的 JSON。它会在右方括号] 之前产生尾随逗号,。 JSON 规范不允许尾随逗号。请参阅此answer 和此reference。

为了构建已接受的解决方案,我使用了以下方法:

from bson.json_util import dumps
from pymongo import MongoClient
import json

if __name__ == '__main__':
    client = MongoClient()
    db = client.db_name
    collection = db.collection_name
    cursor = collection.find()
    with open('collection.json', 'w') as file:
        json.dump(json.loads(dumps(cursor)), file)

【讨论】:

这是我认为最好的解决方案【参考方案2】:
"""
@Author: Aseem Jain
@profile: https://www.linkedin.com/in/premaseem/

"""
import os
import pymongo

# configure credentials / db name
db_user = os.environ["MONGO_ATLAS_USER"]
db_pass = os.environ["MONGO_ATLAS_PASSWORD"]
db_name = "sample_mflix"

connection_string = f"mongodb+srv://db_user:db_pass@sharedcluster.lv3wx.mongodb.net/db_name?retryWrites=true&w=majority"

client = pymongo.MongoClient(connection_string)
db = client[db_name]

# create database back directory with db_name
os.makedirs(db_name, exist_ok=True)

# list all tables in database
tables = db.list_collection_names()

# dump all tables in db
for table in tables:
    print("exporting data for table", table )
    data = list(db[table].find())
    # write data in json file
    with open(f"db.name/table.json","w") as writer:
        writer.write(str(data))

exit(0)

【讨论】:

【参考方案3】:

只需获取所有文档并将它们保存到文件中,例如:

from bson.json_util import dumps
from pymongo import MongoClient

if __name__ == '__main__':
    client = MongoClient()
    db = client.db_name
    collection = db.collection_name
    cursor = collection.find()
    with open('collection.json', 'w') as file:
        file.write('[')
        for document in cursor:
            file.write(dumps(document))
            file.write(',')
        file.write(']')

【讨论】:

如何将它们准确地保存到文件中? @AnhNg 我加了一个例子,看看吧。 这会产生如下错误:TypeError: Object of type 'ObjectId' is not JSON serializable 得到了相同的TypeError。您可以通过导入from bson.json_util import dumps 替换file.write(json.dumps(document)) 并将行替换为file.write(dumps(document)) Learn more 来解决它 这实际上会产生一个无效的 JSON,因为 file.write(']') 之前的最后一个 file.write(',') 将导致文件 ,] 无效。【参考方案4】:

补充@kamilitw 我使用光标的长度来正确地制作一个JSON文件。我使用count()if-else

def writeToJSONFile(collection):
    cursor = collection.find()
    file = open("collection.json", "w")
    file.write('[')
    qnt_cursor = 0
    for document in cursor:
        qnt_cursor += 1
        num_max = cursor.count()
        if (num_max == 1):
            file.write(json.dumps(document, indent=4, default=json_util.default))
        elif (num_max >= 1 and qnt_cursor <= num_max-1):
            file.write(json.dumps(document, indent=4, default=json_util.default))
            file.write(',')
        elif (qnt_cursor == num_max):
            file.write(json.dumps(document, indent=4, default=json_util.default))
    file.write(']')
    return file

所以 JSON 文件在 and 中是正确的,因为之前写成这样:["test": "test",],现在写成:["test":"test1","test":"test2"]

【讨论】:

【参考方案5】:

这是另一种在右方括号之前不保存, 的方法。也使用with open 来节省一些空间。

filter = "type": "something"
type_documents = db['cluster'].find(filter)
type_documents_count = db['cluster'].count_documents(filter)

with open("type_documents.json", "w") as file:
    file.write('[')
    # Start from one as type_documents_count also starts from 1.
    for i, document in enumerate(type_documents, 1):
        file.write(json.dumps(document, default=str))
        if i != type_documents_count:
            file.write(',')
    file.write(']')

如果迭代次数等于文档数(这是它保存的最后一个文档),它基本上不写逗号。

【讨论】:

以上是关于如何使用 pymongo 将集合转储到 json 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”

如何将字典转储到 JSON 文件?

将 Null 项插入集合 Mongodb (Pymongo)

使用 pymongo 将数据从 Mysql 迁移到 MongoDB

如何使用 PyMongo 查找所有集合的名称?

如何在python中将光标列表转换为JSON格式?