выбрав ключом "второй уровень" на mongodb - PullRequest
2 голосов
/ 23 июля 2011

скажем, у меня есть такая структура в mongodb:

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

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

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

как я могу выбрать все источники, которые имеют поля 'phone' (source1 и source3)?что-то вроде * .phone {$ Существует: правда}

1 Ответ

5 голосов
/ 23 июля 2011

По сути, вы не можете сделать это, как вы сказали «* .phone» в mongodb, вы всегда должны указывать поле для того, что вы пытаетесь сделать, запрашивая.

Так что одно уродливое решение можно вручную проверить в каждом источнике:

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 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...