5
respostas

Query Mongo

Pessoal tenho a seguinte dúvida. tenho o documento

{
    "_id" : 4541637,
    "_class" : "br.gov.sp.sessp.api.models.Servidor",
    "nome" : "ADEMAR DOS SANTOS JUNIOR",
    "cpf" : "024684858454",
    "infoServidor" : [ 
        {
            "pvCodigo" : 1,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 6,
                "uoDescricao" : "Coordenadoria de Serviços de Saúde",
                "udCodigo" : 29,
                "udDescricao" : "COMPLEXO HOSPITALAR JUQUERY,FRANCO ROCHA",
                "uaCodigo" : 73103,
                "uaDescricao" : "DIV.SAUDE PAC.INTERNADOS-CHJ"
            },
            "cargo" : {
                "_id" : 5526,
                "descricao" : "MEDICO III"
            }
        }, 
        {
            "pvCodigo" : 2,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 2,
                "uoDescricao" : "Coordenadoria de Regiões de Saúde",
                "udCodigo" : 191,
                "udDescricao" : "DEP.REGIONAL SAUDE GDE.SAO PAULO-DRS-1",
                "uaCodigo" : 69799,
                "uaDescricao" : "UNIDADE BASICA SAUDE-CAIEIRAS"
            },
            "cargo" : {
                "_id" : 5526,
                "descricao" : "MEDICO III"
            }
        }
    ]
}

/* 2 */
{
    "_id" : 9154292,
    "nome" : "ADELI CAMPOY DUENHAS",
    "cpf" : "09998678810",
    "infoServidor" : [ 
        {
            "pvCodigo" : 1,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 2,
                "uoDescricao" : "Coordenadoria de Regiões de Saúde",
                "udCodigo" : 4,
                "udDescricao" : "DEP.REG.SAUDE ARACATUBA-DRS II-ARACATUBA",
                "uaCodigo" : 85350,
                "uaDescricao" : "SEC.ADMINIST.-N.G.A.-ARACATUBA"
            },
            "cargo" : {
                "codigo" : 4349,
                "descricao" : "OFICIAL ADMINISTRATIVO"
            }
        }
    ]
}

Quando executo a query

db.servidor.find({"_id":4541637},{"infoServidor":{$elemMatch:{"unidade.uaCodigo":73103}}})

Tenho o retorno

{
    "_id" : 4541637,
    "infoServidor" : [ 
        {
            "pvCodigo" : 1,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 6,
                "uoDescricao" : "Coordenadoria de Serviços de Saúde",
                "udCodigo" : 29,
                "udDescricao" : "COMPLEXO HOSPITALAR JUQUERY,FRANCO ROCHA",
                "uaCodigo" : 73103,
                "uaDescricao" : "DIV.SAUDE PAC.INTERNADOS-CHJ"
            },
            "cargo" : {
                "_id" : 5526,
                "descricao" : "MEDICO III"
            }
        }
    ]
}

que é quase o esperado, mas eu queria os outros campos do documento pai como nome, cpf por exemplo.

Alguém pode me ajudar?

5 respostas

Boa noite Franklin,

Pura hipótese: não dá pra fazer o seguinte?

db.servidor.find({"_id":{$elemMatch:{"nome" : "ADEMAR DOS SANTOS JUNIOR"}}},{"infoServidor":{$elemMatch:{"unidade.uaCodigo":73103}}})

Avisa aí se der certo.

Abraço.

Vlw pela tentativa Rafael mas não funciona, o elemMatch faz busca em um campo tipo array o que não seria o primeiro caso. Por desencargo de consciência eu fiz o teste mas retorna nulo.

Olá Franklin,

Após a sua explicação, li um pouco sobre o $elemMatch na documentação do MongoDB.

No exemplo do site, ele inclui no find apenas o campo do tipo array.

Logo, será que a consulta não seria essa:

db.servidor.find( { infoServidor : { $elemMatch: { "unidade.uaCodigo":73103 } } } )

Avisa aí se der certo.

Abraço.

Também não, se eu faço isso ele retorna os dois , mesmo o que não tem essa uaCodigo

{
    "_id" : 4541637,
    "_class" : "br.gov.sp.sessp.api.models.Servidor",
    "nome" : "ADEMAR DOS SANTOS JUNIOR",
    "cpf" : "02468485882",
    "infoServidor" : [ 
        {
            "pvCodigo" : 1,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 6,
                "uoDescricao" : "Coordenadoria de Serviços de Saúde",
                "udCodigo" : 29,
                "udDescricao" : "COMPLEXO HOSPITALAR JUQUERY,FRANCO ROCHA",
                "uaCodigo" : 73103,
                "uaDescricao" : "DIV.SAUDE PAC.INTERNADOS-CHJ"
            },
            "cargo" : {
                "_id" : 5526,
                "descricao" : "MEDICO III"
            }
        }, 
        {
            "pvCodigo" : 2,
            "exCodigo" : 0,
            "unidade" : {
                "uoCodigo" : 2,
                "uoDescricao" : "Coordenadoria de Regiões de Saúde",
                "udCodigo" : 191,
                "udDescricao" : "DEP.REGIONAL SAUDE GDE.SAO PAULO-DRS-1",
                "uaCodigo" : 69799,
                "uaDescricao" : "UNIDADE BASICA SAUDE-CAIEIRAS"
            },
            "cargo" : {
                "_id" : 5526,
                "descricao" : "MEDICO III"
            }
        }
    ]
}

Olá Franklin,

Li mais um pouco sobre o find e vi que ele tem dois parâmetros: query e projection.

Pesquisando sobre o projection (também me deparei com este link), talvez algo que resolva a questão seja o seguinte:

db.servidor.find( { infoServidor : { $elemMatch: { "unidade.uaCodigo":73103 } } }, { "infoServidor.$": 1 } )

Avisa aí se der certo.

Abraço.