嵌入在多个文档中的MongoEngine文档不相同

问题描述 投票:2回答:1

我有一个Contract类,它由页面和段落列表组成。页面和段落定义为单独的EmbeddedDocument类。 (请注意,Paragraph可以跨越多页,因此不能是Page的子级。)

每个PageParagraph依次具有Line对象的列表。一行将同时出现在页面和段落中。

类的结构如下:

class Line(mongoengine.EmbeddedDocument):
    _id = mongoengine.ObjectIdField(required=True, default=ObjectId)
    text = mongoengine.StringField()

class Page(mongoengine.EmbeddedDocument):
    lines = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Line))

class Paragraph(mongoengine.EmbeddedDocument):
    lines = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Line))

class Contract(mongoengine.Document):
    pages = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Page))
    paragraphs = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Paragraph))

当我创建新合同并将行添加到首页和段落时,该行是一个单独的对象。可以在下面看到:

# create a new contract
contract = Contract()

# create a new line
line = Line()
line.text = 'This is a test'

# create a new page and add the new line
page = Page()
page.lines.append(line)
contract.pages.append(page)

# create a new paragraph and add the new line
paragraph = Paragraph()
paragraph.lines.append(line)
contract.paragraphs.append(paragraph)

contract.save()

print(contract.pages[0].lines[0] is contract.paragraphs[0].lines[0])
>> True

print(contract.pages[0].lines[0]._id)
>> 5e7b85ebd3844b44ee1a0c8e

print(contract.paragraphs[0].lines[0]._id)
>> 5e7b85ebd3844b44ee1a0c8e

问题是,将Contract对象保存到MongoDB,然后再次在python中加载后,行对象不再相同。它们仍然具有相同的_id,但是如果我测试是否相等,现在返回False:

print(contract.pages[0].lines[0] is contract.paragraphs[0].lines[0])
>> False

print(contract.pages[0].lines[0]._id)
>> 5e7b85ebd3844b44ee1a0c8e

print(contract.paragraphs[0].lines[0]._id)
>> 5e7b85ebd3844b44ee1a0c8e

这是一个问题,因为当我现在更新Line下的Page时,更改不会反映在Paragraph中。

有没有一种方法可以确保Python / MongoEngine理解该行是相同的?

我正在运行Python 3.6,mongoengine 0.19.1

python python-3.x mongodb mongoengine
1个回答
0
投票

[is如果两个变量指向同一个对象,则返回True;如果变量所引用的对象相等,则返回==

Is there a difference between "==" and "is"?

更改为:

print(contract.pages[0].lines[0] == contract.paragraphs[0].lines[0])

说明

在保存contract实例之前,pagesparagraphs都具有相同的线实例。

保存后,pymongo将您的对象序列化为BSON结构。

一旦从MongoDB中检索,python将通过BSON结构(反序列化)为pagesparagraphs创建新实例

© www.soinside.com 2019 - 2024. All rights reserved.