2014-09-27 48 views
0

考慮這個MongoDB的文件: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" 
           } 
       } 
      ] 

}

我怎麼會只檢索 '設置' 字典用於特定配置文件的名字嗎?在這個例子中我們使用'harry'。我曾嘗試:

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

但這檢索PROFILE_NAME的整個詞典: '哈利'

{ 
    '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" 
           } 
       } 

我明顯有我的投影搞砸了,但我不知道如何解決它。建議?

回答

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" } } 
+0

我希望不要使用聚合框架。但如果這是唯一的方式。你知道什麼會更快,使用聚合框架還是隻做我所做的,並從結果字典中手動提取「設置」? – 2014-09-27 22:34:21

0

我想mongodb已經添加了一些功能,因爲問題得到了回答。只是添加一個答案爲目前。在投影中,您只需從嵌入式文檔中提供密鑰並單獨獲取所需的嵌入式文檔。

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