UpdateQueryError MongoDB数组字段

时间:2015-03-24 04:39:56

标签: mongodb mongokit

所以我有一个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定义不同的

2 个答案:

答案 0 :(得分:0)

是的,你是对的。您将需要使用此代码:

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

它将引用&extra;'extra_infos'中的第一个元素。

答案 1 :(得分:0)

extra_infos的数据类型为list而不是dict

一种方法是@atx所建议的,但根据我的说法,这种方法似乎是一种黑客而不是解决方案,因为如果它不是一个词典列表,而是列表中只有一个词典,那么你可以直接有一个dict

您实际上可以将执行程序字段修改为以下内容,无需更改代码:

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