2013-07-08 116 views
0

查询嵌套字典取从MongoDB的托收我有具有收集模式在蒙戈

{user_id:user id, user_details: {name: {age: {profession: {salary: amount}}}}} 

样本条目:

{user_id:001, user_details: { 
          abc:{21:{teacher:{salary:10000}, 
             book-seller:{salary:10000}}, 
            34:{farmer:{salary:5000}}}, 
          xyz:{40:{manager:{salary:200000}, 
             asst_manager:{salary:198900}}} 
          } 
} 
{user_id:002, user_details: { 
          abc:{19:{student:{salary:1000}, 
             book-seller:{salary:10000}}, 
            34:{farmer:{salary:5000}}}, 
          xyz:{45:{manager:{salary:200000}, 
             asst_manager:{salary:198900}}} 
          } 

} 

有没有一种方法来查询所有文件中的用户名是'abc'?

+2

是的,但是你的模式将很难查询和更新。不要使用文档字段名称来包含非静态数据,这是值的目的。 – JohnnyHK

+0

@ its-me,这个示例文档是完全不可读的,无效 –

+0

@JohnnyHK我无法更改模式,该模式目前正在我们项目的许多地方使用。您可以确认我没有笔直为特定用户名查找所有文档的方法? –

回答

3

使用pymongo:

key = 'user_details.{username}'.format(username='abc') 
db.collections.find({key: {'$exists': True}}) 

这使用$exists运算符来查找基于密钥。

您必须为每个用户名动态生成'key'变量。

+0

它为用户abc提供所有文档,但它不仅返回包含用户abc的子文档的完整文档。感谢帮助! –

1

可以使用$exists运营商和点符号要做到这一点,但你需要动态建立查询像这样(在shell):

var user = 'abc'; 
var query = {}; 
query['user_details.' + user] = { $exists: true }; 
db.coll.find(query);