Mongoengine将特定于集合中文档的事件记录到具有新字段的另一个集合中

时间:2016-04-27 16:54:05

标签: python-2.7 mongoengine

在我的项目中,我使用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()

然后,当它调用原始集合的保存方法时,原始集合中有多个字段的唯一索引,无法保存到数据库。

  1. 有没有简单的方法将事件记录到LogEvents集合而不会有太多麻烦。
  2. 使用save方法对cascadecascade_kwargs选项有何用处,我们如何才能使用它??

2 个答案:

答案 0 :(得分:0)

  
      
  1. 使用save方法对cascade和cascade_kwargs选项有什么用处,我们如何才能使用它??
  2.   

Mongoengine Docs

  

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集合中单独保存。通过一些创造性的工作,您可以传递多个值或设置多个属性。