วิธีการค้นหาในอาร์เรย์ของวัตถุใน MongoDB


207

สมมติว่าเอกสาร mongodb (ตาราง) 'ผู้ใช้' คือ

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

ฉันต้องการค้นหาบุคคลที่มีรางวัล 'National Medal' และต้องได้รับรางวัลในปี 1975 อาจมีบุคคลอื่นที่ได้รับรางวัลนี้ในปีที่แตกต่างกัน

ฉันจะค้นหาบุคคลนี้โดยใช้ประเภทรางวัลและปีได้อย่างไร ดังนั้นฉันสามารถรับคนที่แน่นอน

คำตอบ:


367

วิธีที่ถูกต้องคือ:

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

$elemMatch ช่วยให้คุณจับคู่มากกว่าหนึ่งองค์ประกอบภายในองค์ประกอบอาร์เรย์เดียวกัน

โดยไม่มี$elemMatchmongo จะค้นหาผู้ใช้ที่มีเหรียญแห่งชาติในบางปีและรางวัลบางอย่างในปี 1975 แต่ไม่ใช่สำหรับผู้ใช้ที่มีเหรียญแห่งชาติในปี 1975

ดูMongoDB $ elemMatch เอกสารประกอบสำหรับข้อมูลเพิ่มเติม ดูอ่านเอกสารการดำเนินงานสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสืบค้นเอกสารด้วยอาร์เรย์


4
ie elemMatch จับคู่รางวัล 'และ' ปี (ตรงข้ามกับรางวัล 'หรือ' ปี)
Aditya Mittal

เราจะค้นหาเฉพาะเอกสารที่มีชื่อเป็น John และให้รางวัลเป็นเหรียญแห่งชาติด้วยวิธีง่ายๆได้อย่างไร เราทำมันด้วยการรวมและวนซ้ำผ่านอาร์เรย์รางวัล แต่ต้องการทราบคำถามง่ายๆ
Venkatesh Kolla - user2742897

23

ใช้$ elemMatchเพื่อค้นหาอาร์เรย์ของวัตถุเฉพาะ

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

0

สามารถทำได้สองวิธี:

  1. ElementMatch - $elemMatch(ตามที่อธิบายไว้ในคำตอบข้างต้น)

    db.users.find ({รางวัล: {$ elemMatch: {รางวัล: 'รางวัลทัวริง' ปี: 1977}}})

  2. ใช้$andกับfind

    db.getCollection ('users'). find ({"$ และ": [{"awards.award": "Turing Award"}, {"awards.year": 1977}]})

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.