Cara mencari di array objek di mongodb

207

Misalkan dokumen mongodb (tabel) 'pengguna'

{
  _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

Saya ingin mencari orang yang memiliki penghargaan 'Medali Nasional' dan harus diberikan pada tahun 1975. Mungkin ada orang lain yang memiliki penghargaan ini di tahun yang berbeda.

Bagaimana saya dapat menemukan orang ini menggunakan jenis penghargaan dan tahun. Jadi saya bisa mendapatkan orang yang tepat.

vcxz
sumber

Jawaban:

367

Cara yang benar adalah:

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

$elemMatch memungkinkan Anda untuk mencocokkan lebih dari satu komponen dalam elemen array yang sama.

Tanpa $elemMatch mongo akan mencari pengguna dengan Medali Nasional dalam beberapa tahun dan beberapa penghargaan pada tahun 1975, tetapi tidak untuk pengguna dengan Medali Nasional pada tahun 1975.

Lihat Dokumentasi MongoDB $ elemMatch untuk info lebih lanjut. Lihat Baca Dokumentasi Operasi untuk informasi lebih lanjut tentang permintaan dokumen dengan array.

Leonid Beschastny
sumber
4
yaitu elemMatch cocok dengan penghargaan 'dan' tahun (sebagai lawan dari penghargaan 'atau' tahun)
Aditya Mittal
bagaimana kita hanya menanyakan dokumen-dokumen yang memiliki nama depan sebagai John dan penghargaan sebagai medali nasional secara sederhana? kami melakukannya dengan agregat dan mengulangi melalui array penghargaan tetapi ingin tahu permintaan sederhana
Venkatesh Kolla - user2742897
23

Gunakan $ elemMatch untuk menemukan larik objek tertentu

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

Dapat melakukan ini dengan dua cara:

  1. ElementMatch - $elemMatch(seperti yang dijelaskan dalam jawaban di atas)

    db.users.find ({penghargaan: {$ elemMatch: {award: 'Turing Award', tahun: 1977}}})

  2. Gunakan $anddenganfind

    db.getCollection ('pengguna'). find ({"$ dan": [{"awards.award": "Turing Award"}, {"awards.year": 1977}]})

Joby Wilson Mathews
sumber