1

所以我有一个 mongo 对象:

@connection.register
class UserInformation(Document):
    structure = {
        'extra_infos':[{
            'nickname':basestring,
            'name_on_account':basestring,
        }],
        'age': int,
        'mean_distance':float,
    }

我将文档更新为此

@connection.register
class UserInformation(Document):
    structure = {
        'extra_infos':[{
            'nickname':basestring,
            'name_on_account':basestring,
            'email':basestring,
        }],
        'age': int,
        'mean_distance':float,
    }

然后我继续进行以下迁移:

class UserInformationMigration(DocumentMigration):
    def allmigration01_email(self):
        self.target = {'extra_infos':{'$exists':True},'extra_infos.email':{'$exists':False}}
        self.update = {'$set':{'extra_infos.email':[]}}

然后我执行了以下命令

migration = UserInformationMigration(UserInformation)
migration.migrate_all(collection=connection['user_info'])

但我不断收到以下错误:

UpdateQueryError: 'extra_infos.email' not found in UserInformation's structure

我究竟做错了什么?是因为 extra_infos 是一个数组吗?我怀疑我的迁移定义不正确,但我不确定如何为数组 extra_infos 以不同方式定义它

4

2 回答 2

0

是的,你是对的。您将需要改用它:

self.update = {'$set':{'extra_infos.0.email':[]}}

它将引用“extra_infos”中的第一个元素。

于 2015-05-08T12:07:17.273 回答
0

extra_infosislist和 not的数据类型dict

一种方法是@atx 所建议的,但根据我的说法,这种方法似乎是一种技巧,而不是一种解决方案,因为如果它不是一个字典列表,而是列表中只有一个字典,你可能直接有一个dict.

您实际上可以按以下方式修改 executor 字段,而无需更改您的代码:

@connection.register class UserInformation(Document): structure = { 'extra_infos':{ 'nickname':basestring, 'name_on_account':basestring, 'email':basestring, }, 'age': int, 'mean_distance':float, }

于 2017-03-17T05:15:13.117 回答