Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoengine:如何递归地取消对文档的引用并将其转换为dict?_Mongodb_Python 2.7_Mongoengine - Fatal编程技术网

Mongodb Mongoengine:如何递归地取消对文档的引用并将其转换为dict?

Mongodb Mongoengine:如何递归地取消对文档的引用并将其转换为dict?,mongodb,python-2.7,mongoengine,Mongodb,Python 2.7,Mongoengine,我需要将mongoengine文档转换为dict,以便在json中序列化它。我已经尝试使用to_mongo()方法,但是引用字段被忽略。使用DeReference()(video.\u data)时,我得到了以下结果: {'audience': 0, 'channels': [], 'created_date': datetime.datetime(2006, 1, 2, 12, 11, 3), 'id': ObjectId('51af7076a2aa1c2179035e8e'), 'i

我需要将mongoengine文档转换为dict,以便在json中序列化它。我已经尝试使用
to_mongo()
方法,但是
引用字段被忽略。使用
DeReference()(video.\u data)
时,我得到了以下结果:

{'audience': 0,
 'channels': [],
 'created_date': datetime.datetime(2006, 1, 2, 12, 11, 3),
 'id': ObjectId('51af7076a2aa1c2179035e8e'),
 'images': {},
 'kind': u'VOD',
 'modified_date': datetime.datetime(2013, 6, 5, 19, 39, 4, 327000),
 'parts': [[<Media: VOD 0x0>,
   <Media: VOD 0x0>,
   <Media: VOD 0x0>,
   <Media: VOD 0x0>]],
 'provider': <Provider: TEST>,
 'published_date': datetime.datetime(2006, 1, 2, 12, 11, 3),
 'sources': [<Source: TEST>],
 'titles': {u'en-US': u'TEST', u'es-ES': u'PRUEBA', u'pt-BR': u'TESTE'}
}
{'观众]:0,
“频道”:[],
“created_date”:datetime.datetime(2006,1,2,12,11,3),
“id”:ObjectId('51af7076a2aa1c2179035e8e'),
“图像”:{},
“种类”:u“VOD”,
“修改日期”:datetime.datetime(2013,6,5,19,39,4327000),
“部分”:[[,,
,
,
]],
“提供者”:,
“发布日期”:datetime.datetime(2006,1,2,12,11,3),
“来源”:[…],
标题:{u'en-US':u'TEST',u'es-es':u'PRUEBA',u'pt-BR':u'TESTE'}
}

我想要的是递归地取消对
媒体
提供者
对象的引用。由于它们的类型是
ReferenceField
,我如何才能找到它?

现在不是从DBRef获取数据的现成方法。但是,
对_mongo
dict conatins:

  • 简单的项目,如数字、字符串、日期时间、ID等
  • DBRef项目
  • 清单项目
  • 口述项目
  • 因此,在获取并替换为
    to_mongo
    之后,您可以通过列表和dict进行迭代,并检查DBRef类型。但您必须检查需要哪些引用,必须获取多深的子引用,如何正确解析自引用和递归引用


    例如,查看mongo python驱动程序如何将python对象转换为自身格式:.

    要获取ReferenceField值,您需要调用引用字段上的
    。\u mongo()
    ,而不是父文档,因为这只会返回文档的DBRef或ObjectId

    因此,在您的示例中,您有3个引用字段:
    provider
    parts
    sources
    给定一个名为
    my_doc
    的文档实例,以获取引用文档的字典值,请执行以下操作:

    provider = my_doc.provider.to_mongo()
    parts = [part.to_mongo() for part in my_doc.parts]
    sources = [source.to_mongo() for source in my_doc.sources]
    
    **旁注

    显示的模式似乎高度相关,引用字段导致应用程序内连接(MongoEngine必须为您进行内部查询和取消引用)。在获取文档的所有部分时,这不会在高级别上执行-您需要查询一次文档本身、一次提供者、一次部分和一次源-4次查询以检索一个文档。对于较大的查询集,不进行
    queryset。选择\u related(2)
    ,这意味着4x查询集计数。这可能并不理想