Python 2.7 Mongoengine将集合中特定于文档的事件记录到具有新字段的另一个集合
在我的项目中,我将Mongodb与mongoengine ORM(Python)结合使用 MongoDB外壳版本:3.0.3 pymongo==3.1.1 mongoengine==0.10.1 我想通过原始文档字段加上一些新字段,将集合发生的事件跟踪到日志集合 也就是说,当原始集合中的文档使用事件更新时,将有一个新文档添加到日志集合中Python 2.7 Mongoengine将集合中特定于文档的事件记录到具有新字段的另一个集合,python-2.7,mongoengine,Python 2.7,Mongoengine,在我的项目中,我将Mongodb与mongoengine ORM(Python)结合使用 MongoDB外壳版本:3.0.3 pymongo==3.1.1 mongoengine==0.10.1 我想通过原始文档字段加上一些新字段,将集合发生的事件跟踪到日志集合 也就是说,当原始集合中的文档使用事件更新时,将有一个新文档添加到日志集合中 class Original(DynamicDocument): identifier = StringField(required=True, uni
class Original(DynamicDocument):
identifier = StringField(required=True, unique=True, primary_key=True)
field1 = StringField()
class LogEvents(DynamicDocument):
pass
为此,我试图利用
当我们调用列save()时
1) 它使用原始文档的主键字段(_id)更新到log_events集合,因此无法在原始集合中记录与同一文档相关的多个事件
class Original(DynamicDocument):
identifier = StringField(required=True, unique=True, primary_key=True)
field1 = StringField()
class LogEvents(DynamicDocument):
pass
2) 即使我们将主键字段(_id)更改为新值并保存()
col=Original.objects.get(id=some\u id)
col.switch\u集合('log\u events',False)
上校id=
col.new\u field=“new\u field”
保存()列
然后,由于它调用原始集合的save方法,并且原始集合上有多个字段的唯一索引,因此无法保存到DB
是否有任何简单的方法可以轻松地将事件记录到LogEvents集合中
cascade
和cascade_-kwargs
选项与该方法有什么关系,我们如何利用它
cascade和cascade_kwargs选项与save方法有什么关系?我们如何利用它
:
级联保存(*args,**kwargs)
基本上,这决定了保存引用者文档时是否自动保存引用的文档
我认为这与你的问题无关
cascade和cascade_kwargs选项与save方法有什么关系?我们如何利用它
:
级联保存(*args,**kwargs)
基本上,这决定了保存引用者文档时是否自动保存引用的文档
我认为这与您的问题无关。解决这类问题的一个简单方法是重载原始类的save()
方法。大概是这样的:
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集合中传入一个单独保存的值。通过一些创造性的工作,您可以传递多个值或设置多个属性。解决这类问题的一个简单方法是重载原始类的save()
方法。大概是这样的:
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集合中传入一个单独保存的值。通过一些创造性的工作,您可以传递多个值或设置多个属性。Jerome您可以提供更多关于它的信息吗?Jerome您可以提供更多关于它的信息吗?它仍然抛出NotUniqueError
,因为原始集合上有唯一的索引。它仍然抛出NotUniqueError
,因为原始集合上有唯一的索引。
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()