在我的项目中,我使用Mongodb和mongoengine ORM(Python),
MongoDB shell版本:3.0.3
pymongo == 3.1.1
mongoengine == 0.10.1
我想跟踪集合中发生的事件到log_collection,原始文档字段加上一些新字段。
即当原始集合中的文档更新了事件时,会有一个新文档添加到log_collection。
class Original(DynamicDocument):
identifier = StringField(required=True, unique=True, primary_key=True)
field1 = StringField()
class LogEvents(DynamicDocument):
pass
为此,我尝试使用mongoengeine switch_collection
col = Original.objects.get(id=some_id)
col.switch_collection('log_events', False)
col.new_field = "new_field"
col.save()
当我们拨打col.save()
时,
1)它使用原始文档的主键字段(_id)更新到 log_events 集合,因此我们无法在Original集合中记录与同一文档相关的多个事件。
2)即使我们将主键字段(_id)更改为新值并保存(),
col = Original.objects.get(id=some_id)
col.switch_collection('log_events', False)
col.id=<new-id>
col.new_field = "new_field"
col.save()
然后,当它调用原始集合的保存方法时,原始集合中有多个字段的唯一索引,无法保存到数据库。
cascade
和cascade_kwargs
选项有何用处,我们如何才能使用它??答案 0 :(得分:0)
- 使用save方法对cascade和cascade_kwargs选项有什么用处,我们如何才能使用它??
醇>
cascade_save(* args,** kwargs)
Recursively saves any references / generic references on the document
基本上,这决定了在保存参考文档时是否自动保存参考文档。
我认为这与您的问题无关。
答案 1 :(得分:0)
针对您的问题的一个简单选项是重载save()
类的Original
方法。像这样:
class Original(DynamicDocument):
identifier = StringField(required=True, unique=True, primary_key=True)
field1 = StringField()
def save(self, value):
#save the document in its normal collections
super(Original, self).save()
#switch collection and save a new event
with switch_collection(Original, 'log_events') as Events:
self.new_field = value
#let's give it a new id
self.identifier = 'something new'
super(Events, self).save()
现在每次保存Original的实例时,都可以传入一个值,以便在log_events集合中单独保存。通过一些创造性的工作,您可以传递多个值或设置多个属性。