2014-09-28 42 views
0

从我读过的内容来看,不可能使用mongo中的位置运算符$来更新嵌套数组中的元素。 $只能工作一个级别。我发现它是mongo 2.7中的一个请求功能。Mongodb:如何更改嵌套的arrary的元素?

由于写入冲突,更新整个文档one level up不是一个选项。例如,我需要修改特定奖励计划的'username'

其中一个想法是拉动,修改,并推动整个'reward_programs'元素,但然后我会失去秩序。订单很重要。

审议本文件:

{ 
    "_id:"0, 
    "firstname":"Tom", 
    "profiles" : [ 
       { 
        "profile_name": "tom", 
        "reward_programs:[ 
             { 
              'program_name':'American', 
              'username':'tomdoe', 
             }, 
             { 
              'program_name':'Delta', 
              'username':'tomdoe', 
             } 
             ] 
       } 
      ] 
} 

你会如何去具体改变'program_name'=Delta'username'

回答

1

在做了更多的阅读之后,它看起来在mongodb目前不支持。位置更新仅支持一个深度级别。可以为mongodb 2.7添加该功能。

这是一对夫妇的工作。

1)展平你的数据库结构。在这种情况下,制作'reward_programs'它是自己的收藏,并对其进行操作。

2)而不是数组的字典,使用字典的字典。这样你就可以拥有一条绝对路径到你需要修改的对象。这对查询灵活性可能有缺点。

3)似乎哈克给我,但你也可以步行列表中的嵌套阵列上找到它的数组中的位置索引,做这样的事情:

users.update({'_id': request._id, 'profiles.profile_name': profile_name}, {'$set': {'profiles.$.reward_programs.{}.username'.format(index): new_username}})  

4)阅读整个文档中,修改,回信。但是,这可能会造成写冲突

最初设置数据库结构非常重要。这真的取决于你将如何使用它。

0

一个简单的方法来做到这一点:

doc = collection.find_one({'_id': 0}) 
doc['profiles'][0]["reward_programs"][1]['username'] = 'new user name' 
#replace the whole collection 
collection.save(doc)