我有一个Contract
类,它由页面和段落列表组成。页面和段落定义为单独的EmbeddedDocument
类。 (请注意,Paragraph
可以跨越多页,因此不能是Page
的子级。)
每个Page
和Paragraph
依次具有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
[is如果两个变量指向同一个对象,则返回
True
;如果变量所引用的对象相等,则返回==
。
Is there a difference between "==" and "is"?
更改为:
print(contract.pages[0].lines[0] == contract.paragraphs[0].lines[0])
在保存contract
实例之前,pages
和paragraphs
都具有相同的线实例。
保存后,pymongo
将您的对象序列化为BSON结构。
一旦从MongoDB中检索,python将通过BSON结构(反序列化)为pages
和paragraphs
创建新实例