【问题标题】:Can one use mongoengine to define a document first, then use pymongo to insert many documents?可以先用 mongoengine 定义一个文档,然后用 pymongo 插入很多文档吗?
【发布时间】:2020-09-25 10:46:23
【问题描述】:

MongoEngine 非常适合定义用于数据验证的文档。这方面缺乏生的 pymongo。我可以先使用 MongoEngine 定义一个文档,然后使用 pymongo 将许多文档插入一个空集合中吗?如果是,pymongo的insertMany()会根据mongoengine设置的文档定义做数据校验吗?

pymongo 和 mongoengine 代码可以混合在同一个 python 脚本中吗?

我使用的是python 3.7,mongodb v4.2.7。

【问题讨论】:

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


    【解决方案1】:

    你的三个问题:

    '可以先用MongoEngine定义一个文档,再用pymongo将很多文档插入一个空集合吗? '

    是的。

    '如果是,pymongo的insertMany()会根据mongoengine设置的文档定义做数据校验吗?'

    没有。

    'pymongo 和 mongoengine 代码可以混合在同一个 python 脚本中吗?'

    是的。

    基于 pymongo 的 Mongoengine。如果您不需要 mongoengine 没有的非常复杂的功能。我建议你只使用 mongoengine 来完成你的工作。这将在大多数情况下节省您的时间。

    【讨论】:

    • 感谢您的回答。从你的回答中我不太明白的一件事。如果pymongo和mongoengine代码可以混用,为什么pymongo的insertMany()不能根据mongoengine设置的文档定义做数据校验?
    • 因为 mongengine 基于 pymongo 做了一些 pymongo 没有的额外工作。 mongoengine 中的验证应该单独使用。 Pymongo 无法识别这些额外的工作。
    【解决方案2】:

    我是 Python 和 Mongo 的新手。我相信您可以像这样使用 MongoEngine 验证每个文档:

    for my_obj in my_objs:
        my_obj.validate()
    

    然后,像这样批量插入:

    dicts = map(lambda my_obj: my_obj.to_mongo().to_dict(), my_objs)
    collection.insert_many(dicts)
    

    但是,如果您不需要直接使用 PyMongo,也可以使用 MongoEngine 进行批量插入。

    【讨论】:

      【解决方案3】:

      让我把你的问题分成三个部分。

      1. 我可以在 pymongo 中使用 mongoengine 验证吗?
      2. 如果使用 insertmany 那么如何验证?
      3. pymongo 和 mongoengine 代码可以混合在同一个 python 脚本中吗?

      答案-:

      1. 不,您不能对 pymongo 使用 mongoengine 验证。因为验证是在 mongoengine 模块中定义的 -:

      从 mongoengine 库获取快照 -- mongoengine -> common.py:

      因此,当您在 mongoenine 中使用验证时,会调用这些函数并验证数据。如果您想为 pymongo 验证数据,那么您必须为此编写自定义验证代码。

      1. Insertmany() 是单独的函数,与 mongoengine 没有关系。所以 mongoenine 定义不适用于 Insertmany()
      2. 是的,您可以在同一个 python 脚本中一起编写 pymongo 和 mongoengine 代码。 [在某些情况下,我们需要这样做]。

      Note -: 如果你同时使用 pymongo 和 mongoenine。小心,因为 mongoengine 有默认的验证功能。所以他们在执行操作之前会检查一些验证。但是pymongo没有任何验证,他们只是插入数据并创建集合[如果不存在]然后插入数据。所以可能会发生数据类型冲突和这样的问题。

      【讨论】:

      • 感谢您的回答。除了验证目的之外,似乎 pymongo 和 mongoengine 代码可以混合在一起。我假设对于查询,代码可以混合使用。
      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2021-05-11
      • 2014-01-17
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2015-09-27
      相关资源
      最近更新 更多