2013-07-19 32 views
2

如果您只知道密钥名称(比如“昵称”),但不知道对象中该密钥的确切路径。通过密钥查询多级别MongoDB对象

例如绰号可能是在第一级,如:

{"nickname":"Howie"} 

或第二级:

{"user":{"nickname":"Howie"}} 

是否可以查询昵称等于“Howie”,将返回这两个文件?

+0

希望得到回答,我只能看到'.find({昵称:“Howie”})'只返回顶层。 – tymeJV

+0

只有当你知道所有可能的路径并将它们与'$或'结合时。 – JohnnyHK

回答

3

不幸的是,没有通配符允许您在db中的任何级别搜索字段。如果位置不相关,并且您可以修改文档结构,那么您在这里有两个选择。您可以将您的文件作为

{ fieldname:"nickname", value : "Howie" } 
{ fieldname:"user/nickname", value: "Howie" } 

然后,您可以查询使用

db.so.find({fieldname:/nickname/, value:"Howie"}) 

另外,您可以存储为

db.so.insert({value:"Howie", fieldpath:["nickname"]}) 
db.so.insert({value:"Howie", fieldpath:["user", "nickname"]}) 

与第二种方法的优点是,您现在可以指数{ fieldpath:1,value:1}以及其上的查询,如

db.so.find({fieldpath:"nickname", value:"Howie"}) 

将是一个索引查询。

+0

谢谢Sridhar,这真的很有帮助!通过这种方式,您可以通过使用字段路径或命名字符串键来将任何多级对象转换为一个级别的对象。我只是想知道它是一种好的/有效的解决方案,还是只在特别需要时才使用的临时解决方案,因为它与正常的建议模式非常不同。 – spacemilkman