По сути, вы не можете сделать это, как вы сказали «* .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 })