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