Espero que alguém possa ajudar.
Herdei um projeto que utiliza um banco de dados Atlas Mongo. Fui solicitado a obter dados de uma coleção. Suponha que os documentos estejam estruturados na coleção da seguinte forma:
{ _id: 'Parent1', kids: [ { _id: 'Test1', grandkids: [ { name: 'Blah' } ] } ] },
{ _id: 'Parent2', kids: [ { _id: 'Test1', grandkids: [ { name: 'Bloh' } ] } ] },
{ _id: 'Parent3', kids: [ { _id: 'Test2', grandkids: [ { name: 'Bloh' } ] } ] }
Preciso obter o neto com o nome 'Bloh' quando o _id da criança for 'Teste 1', o que deve retornar dados do 2º documento.
Usando a interface web do Cloud MongoDb, tentei consultar assim, só para ver se conseguia obter o segundo documento de volta:
{
'$and': [
{ 'kids._id': ObjectId('Test 1') },
{ 'kids.grandkids.name': 'Bloh' }
]
}
Mas não obtive nenhum resultado. Suspeito que possa ser porque o _id em kids não é único.
Supondo que eu consiga o segundo documento de volta, como faço para obter o neto correspondente de volta?
Desde já, obrigado!
Editar:
Usando o playground MongoDb, isso pode ser um problema:
Consulta inválida:
Linha 3: ObjectId inválido: o hash deve ter 24 caracteres
Infelizmente, kid._id não só é duplicado, como também nem sempre tem 24 caracteres.
Escrita
Bem, no seu exemplo,
ObjectId('Test 1')
é inválido, mas no seu documento, é apenas_id: 'Test1'
which que é uma string e está tudo bem. Se você estiver usando ObjectIds nos seus dados reais, substitua ambos os casos por ObejctId na consulta abaixo.Use
$elemMatch
para garantir que ambas as condiçõeskids._id
ekids.grandkids.name
pertencem à mesma criança no array kids:Parque Infantil Mongo
Na sua consulta, se for assim (não ObjectId), então
kids._id
nãokids.grandkids.name
precisa pertencer ao mesmo objeto filho no array kids. Além disso, você coloca'Test 1'
com um espaço extra em vez de'Test1'
:O que funciona, mas na verdade está incorreto . Veja a correspondência extra que ocorre (adicionei alguns dados) para "Parent 4" e essa correspondência extra está errada. Ela corresponde ao termo "
_id
from the first neto" e "name
on the second neto". Mesmo encurtando para o termo equivalente sem$and
o termo, os resultados são os mesmos incorretos :