通过mongodb上的“二级”键选择

时间:2011-07-23 00:11:47

标签: mongodb

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

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

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

  'source3': {
                'name':'john',
                'phone':'5555555'
                'city':'new york'
             }
}

如何选择具有“手机”字段(source1和source3)的所有来源? 类似* .phone {$ exists:true}

1 个答案:

答案 0 :(得分:5)

基本上你不能像你在mongodb中说“* .phone”一样,你应该总是在你试图查询的地方指定字段。

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

db.sources.find( { $or : [ { "source1.phone" : { $exists : true },
                           { "source2.phone" : { $exists : true },
                           { "source3.phone" : { $exists : true }]} };

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

{
  'sources': [{
                'name':'john',
                'phone':'5555555',
                'source_name': "source1"
             },
             {
                'name':'john',
                'city':'new york',
                'source_name': "source2"
             }]
}

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

db.sources.find({ "sources.phone" : { $exists : true })