通过mongodb上的"二级"键选择

Lem*_*m0n 3 mongodb

假设我在mongodb中有类似的结构:

{
  'source1': {
                'name':'john',
                'phone':'5555555'
             }

  'source2': {
                'name':'john',
                'city':'new york'
             }

  'source3': {
                'name':'john',
                'phone':'5555555'
                'city':'new york'
             }
}
Run Code Online (Sandbox Code Playgroud)

如何选择具有"手机"字段(source1和source3)的所有来源?像*.phone {$ exists:true}之类的东西

And*_*ich 6

基本上你不能像你在mongodb中说"*.phone"那样做,你应该总是在你尝试查询的地方指定字段.

因此,一个丑陋的解决方案可以在每个源中手动检查它:

db.sources.find( { $or : [ { "source1.phone" : { $exists : true },
                           { "source2.phone" : { $exists : true },
                           { "source3.phone" : { $exists : true }]} };
Run Code Online (Sandbox Code Playgroud)

但是,如果您将架构重新设计为使用一个嵌套的源数组:

{
  'sources': [{
                'name':'john',
                'phone':'5555555',
                'source_name': "source1"
             },
             {
                'name':'john',
                'city':'new york',
                'source_name': "source2"
             }]
}
Run Code Online (Sandbox Code Playgroud)

您可以在请求返回包含电话字段的所有来源后更轻松地执行此操作:

db.sources.find({ "sources.phone" : { $exists : true })
Run Code Online (Sandbox Code Playgroud)