Mongodb:如何从数组中检索元素?

时间:2014-09-27 19:24:17

标签: mongodb pymongo

考虑一下这个mongodb文档:

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

                    "settings": {
                                    'auto_update': "False"
                                }
               },
               {
                    "profile_name": "harry",
                    "reward_programs:[
                                        {
                                            'program_name':'American',
                                            'username':'car',
                                            'account':'train',
                                        },
                                        {
                                            'program_name':'Delta',
                                            'username':'harrydoe',
                                        }
                                      ]

                    "settings": {
                                    'auto_update': "False"
                                }
               }
            ]

}

我如何只检索'设置'特定个人资料名称的字典?让我们使用哈利'在示例中。我试过了:

result = users.find_one({'_id': request._id, 'profiles.profile_name': 'harry'}, {'_id': 0,  'profiles.$.settings': 1})

但是这会检索profile_name的整个字典:' harry'

  {
    'profiles':
               {
                    "profile_name": "harry",
                    "reward_programs:[
                                        {
                                            'program_name':'American',
                                            'username':'car',
                                            'account':'train',
                                        },
                                        {
                                            'program_name':'Delta',
                                            'username':'harrydoe',
                                        }
                                      ]

                    "settings": {
                                    'auto_update': "False"
                                }
               }
 }

我希望得到结果为

 {
"profiles" : [
               {
                    "settings": {
                                    'auto_update': "False"
                                }
               }
            ]

}

如果足够简单,我甚至会更喜欢:

               {
                    "settings": {
                                    'auto_update': "False"
                                }
               }

我显然让我的投影搞砸了,但我不知道如何解决它。建议?

2 个答案:

答案 0 :(得分:1)

您需要使用聚合框架。这样的东西会给你想要的东西 -

result = db.users.aggregate( [ 
                     { $unwind : "$profiles"}, 
                     { $match : { "profiles.profile_name" : "harry"}}, 
                     { $project : { settings : "$profiles.settings" } }
                     ] )

如果您不想要“_id”字段,则可以将其隐藏起来 -

 result = db.users.aggregate( [ 
                         { $unwind : "$profiles"}, 
                         { $match : { "profiles.profile_name" : "harry"}}, 
                         { $project : { '_id' : 0, settings : "$profiles.settings" } }
                         ] )

结果变量将包含 -

{ "settings" : { "auto_update" : "False" } }

答案 1 :(得分:0)

我想mongodb已经添加了一些功能,因为问题得到了回答。只需添加一个当前的答案。在投影中,您可以从嵌入式文档中提供密钥,并单独获取所需的嵌入式文档。

\b