Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Mongoengine将集合中特定于文档的事件记录到具有新字段的另一个集合_Python 2.7_Mongoengine - Fatal编程技术网

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

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

在我的项目中,我将Mongodb与mongoengine ORM(Python)结合使用

MongoDB外壳版本:3.0.3

pymongo==3.1.1

mongoengine==0.10.1

我想通过原始文档字段加上一些新字段,将集合发生的事件跟踪到日志集合

也就是说,当原始集合中的文档使用事件更新时,将有一个新文档添加到日志集合中

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()