Làm thế nào để tìm kiếm trong mảng của đối tượng trong mongodb


207

Giả sử tài liệu mongodb (bảng) 'người dùng' là

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

Tôi muốn tìm người có giải thưởng 'Huân chương Quốc gia' và phải được trao vào năm 1975 Có thể có những người khác có giải thưởng này trong những năm khác nhau.

Làm thế nào tôi có thể tìm thấy người này bằng cách sử dụng loại giải thưởng và năm. Vì vậy, tôi có thể có được người chính xác.

Câu trả lời:


367

Cách đúng là:

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

$elemMatch cho phép bạn khớp nhiều hơn một thành phần trong cùng một thành phần mảng.

Không có $elemMatchmongo sẽ tìm kiếm người dùng với Huân chương Quốc gia trong một số năm và một số giải thưởng trong năm 1975, nhưng không dành cho người dùng có Huân chương Quốc gia năm 1975.

Xem Tài liệu elemMatch $ MongoDB để biết thêm thông tin. Xem Đọc Tài liệu hoạt động để biết thêm thông tin về truy vấn tài liệu với mảng.


4
tức là elemMatch phù hợp với giải thưởng 'và' năm (trái ngược với giải thưởng 'hoặc' năm)
Aditya Mittal

Làm thế nào để chúng ta chỉ truy vấn những tài liệu có tên đầu tiên là John và trao tặng huy chương quốc gia theo cách đơn giản? chúng tôi làm điều đó với tổng hợp và lặp qua mảng giải thưởng nhưng muốn biết truy vấn đơn giản
Venkatesh Kolla - user2742897

23

Sử dụng $ elemMatch để tìm mảng của đối tượng cụ thể

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

0

Có thể làm điều này theo hai cách:

  1. ElementMatch - $elemMatch(như đã giải thích trong câu trả lời ở trên)

    db.users.find ({Awards: {$ elemMatch: {Prize: 'Turing Award', năm: 1977}}})

  2. Sử dụng $andvớifind

    db.getCollection ('người dùng'). find ({"$ và": [{"Awards.award": "Giải thưởng Turing"}, {"Awards.year": 1977}]})

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.