Como pesquisar na matriz de objetos no mongodb

207

Suponha que o 'mongodb' do documento (tabela) 'users' seja

{
  _id: 1,
  name: { first: 'John', last: 'Backus' },
  birth: new Date('Dec 03, 1924'),
  death: new Date('Mar 17, 2007'),
  contribs: [ 'Fortran', 'ALGOL', 'Backus-Naur Form', 'FP' ],
  awards: [
            { award: 'National Medal',
              year: 1975,
              by: 'NSF' },
            { award: 'Turing Award',
              year: 1977,
              by: 'ACM' }
          ]
}
and other object(person)s

Quero encontrar a pessoa que recebeu o prêmio 'Medalha Nacional' e deve ser premiada no ano de 1975. Pode haver outras pessoas que tenham esse prêmio em anos diferentes.

Como posso encontrar essa pessoa usando o tipo de prêmio e o ano. Para que eu possa ter uma pessoa exata.

vcxz
fonte

Respostas:

367

O caminho certo é:

db.users.find({awards: {$elemMatch: {award:'National Medal', year:1975}}})

$elemMatch permite combinar mais de um componente no mesmo elemento da matriz.

Sem $elemMatch mongo, procurará usuários com a Medalha Nacional em algum ano e algum prêmio na década de 1975, mas não para usuários com a Medalha Nacional em 1975.

Consulte a documentação do MongoDB $ elemMatch para obter mais informações. Consulte Ler documentação da operação para obter mais informações sobre a consulta de documentos com matrizes.

Leonid Beschastny
fonte
4
ie elemMatch corresponde ao prêmio 'e' ano (em oposição ao prêmio 'ou' ano)
Aditya Mittal
como consultamos apenas os documentos que têm o primeiro nome como John e concedem a medalha nacional de maneira simples? fazemo-lo com agregado e iterar variedade prêmios, mas queria saber consulta simples
Venkatesh Kolla - user2742897
23

Use $ elemMatch para encontrar a matriz de um objeto específico

db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})
KARTHIKEYAN.A
fonte
0

Pode fazer isso de duas maneiras:

  1. ElementMatch - $elemMatch(conforme explicado nas respostas acima)

    db.users.find ({prêmios: {$ elemMatch: {prêmio: 'Prêmio Turing', ano: 1977}}})

  2. Use $andcomfind

    db.getCollection ('users'). find ({"$ and": [{"awards.award": "Prêmio de Turing"}, {"awards.year": 1977}]})

Joby Wilson Mathews
fonte