考虑一下这个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"
}
}
我显然让我的投影搞砸了,但我不知道如何解决它。建议?
答案 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