首页 > 解决方案 > 从命令行使用 Python 脚本中的 Json 文件填充 Mongo 数据库

问题描述

page = open("npm.json", "r")
parsed = json.loads(page.read())

for i in parsed["dependencies"]:
    collection.insert_one(i)

嗨,我正在尝试读取一个 json 文件并用名为 ependencies 的行填充我的 mongoDB。它一直给我和错误。我试过 insert, insert_one &insert_many 无济于事。

以下是我得到的错误

    File "database.py", line 43, in <module>
    collection.insert_one(i)
  File "/usr/local/lib/python3.6/dist-packages/pymongo/collection.py", line 684, in insert_one
    common.validate_is_document_type("document", document)
  File "/usr/local/lib/python3.6/dist-packages/pymongo/common.py", line 453, in validate_is_document_type
    "collections.MutableMapping" % (option,))
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "database.py", line 43, in <module>
    collection.insert_one(i)
  File "/usr/local/lib/python3.6/dist-packages/pymongo/collection.py", line 684, in insert_one
    common.validate_is_document_type("document", document)
  File "/usr/local/lib/python3.6/dist-packages/pymongo/common.py", line 453, in validate_is_document_type
    "collections.MutableMapping" % (option,))
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

json 文件是节点依赖项的列表。我在节点项目上运行命令 npm list 。任何人都可以帮助提前谢谢

标签: pythonnode.jsmongodbexpress

解决方案


看起来您的数据dependencies是一个dictionary. 这意味着当你迭代它时,你会得到字符串(在这种情况下是键)。

一个例子是这样的:

my_entry = {'a': 1, 'b': 2}

for i in myentry:
    print(i)

# will print 'a' then 'b', not 1 then 2

我假设每个依赖项都是一个键,并且您想要插入该值。所以

# dictionary.values() will give you just the values
for v in parsed['dependencies'].values():
    if isinstance(v, dict):
        collection.insert_one(v)
    else:
        raise ValueError("object is not dictionary")

Mongo 只会取jsonorbson条目,就像字典一样。当你通过时keys,你试图插入string它不支持的类型的对象


推荐阅读