在我的项目中,我使用Mongodb和mongoengine ORM(Python),
MongoDB外壳版本: 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
为此,我尝试使用集合
col = Original.objects.get(id=some_id)
col.switch_collection('log_events', False)
col.new_field = "new_field"
col.save()
当我们呼叫col.save()
时,
1)它使用原始文档的主键字段( log_events )更新到_id集合,因此不能记录原始集合中涉及同一文档的多个事件。 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()
然后,当它调用原始集合的保存方法时,并且在原始集合上有多个字段的唯一索引,所以不可能将其保存到DB。
cascade
和cascade_kwargs
选项在保存方法中的用途是什么,我们如何使用..?发布于 2016-04-27 23:16:22
cascade_save(*args,**kwargs) 递归地保存文档上的任何引用/泛型引用。
基本上,这决定了在保存引用程序文档时是否会自动保存引用文档。
我不认为这与你的问题有关。
发布于 2016-05-01 10:19:02
解决此类问题的一个简单选项是重载Original
类的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()
现在,每次保存原始实例时,都可以传入要在log_events集合中单独保存的值。通过一些创造性的工作,您可以传递多个值或设置多个属性。
https://stackoverflow.com/questions/36896124
复制