在mongodb中获取文档和参考文档

时间:2017-02-22 21:08:18

标签: mongodb flask pymongo

我正在使用Mongodb和Pymongo开发Flask应用程序。

我在mongo中有一个名为document_load的集合,它引用了另一个名为document的集合,document引用了另一个名为client的集合。< / p>

问题是,我想查询document_load,但我也希望得到document,并且client以有效的方式。

我试过这个来获取特定document的{​​{1}}:

document_load

它有效!它显示了这个:

db.document_load.aggregate([
    {'$lookup': {
        'from': "document",
        'localField': "document",
        'foreignField': "_id",
        'as': "document"
    }},
    {'$match': {
        '_id': ObjectId('587f6e3ef28bd63078419194')
    }}
])

由于某种原因,它将{'document': [{'client': ObjectId('5754b202b480776b79184780'), ...some other fields}], ...some other fields} document显示为一个元素的数组,但现在我也试图以同样的方式获取客户端,不仅是id,而且我不知道怎么做,或者甚至可能。

我一直在寻找,但我找不到任何有用的东西。

提前致谢。

1 个答案:

答案 0 :(得分:0)

当您定义mongo文档时,具有最小的结构,如

from mongoengine import Document, 
from mongoengine import StringField, LazyReferenceField
    
class Client(Document):
    client_name = StringField(required = True, unique = True)
    ...

class DocumenT(Document):
    doc = YourDefinedField(required=True, unique= True)
    ref_client = LazyReference(Client, passthrough=False, reverse_delete_rule=3)
    ...

class Document_Load(Document):
    name = StringField(required = True, unique = True)
    ref_doc = LazyReference(DocumenT, passthrough=False, reverse_delete_rule=3)
        ...

您可以执行以下操作:

Document_Load.objects(name="your_object_identifier").ref_field.fetch() 
# This will return the DocumenT asosiated by ref_doc
# This ref_doc needs to have as value the ObjectId of the reference in DocumenT

由于您要访问集合document,因此只需连接一些ref_docref_client.fetch()

document_ = Document_Load(name = "Payments_Definitive").ref_doc.fetch().ref_client.fetch().client_name