So suchen Sie in einem Array von Objekten in Mongodb

207

Angenommen, das Mongodb-Dokument (Tabelle) "Benutzer" ist

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

Ich möchte die Person finden, die die Auszeichnung "Nationale Medaille" hat und im Jahr 1975 verliehen werden muss. Es könnte andere Personen geben, die diese Auszeichnung in verschiedenen Jahren erhalten.

Wie kann ich diese Person anhand der Art und des Jahres der Auszeichnung finden? So kann ich genaue Person bekommen.

vcxz
quelle

Antworten:

367

Der richtige Weg ist:

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

$elemMatch Mit dieser Option können Sie mehr als eine Komponente innerhalb desselben Array-Elements abgleichen.

Ohne $elemMatchMongo wird nach Nutzern mit Nationalmedaille in einigen Jahren und einigen Auszeichnungen in den 1975er Jahren gesucht, aber nicht nach Nutzern mit Nationalmedaille in 1975.

Weitere Informationen finden Sie in der MongoDB $ elemMatch-Dokumentation . Weitere Informationen zum Abfragen von Dokumenten mit Arrays finden Sie unter Lesen der Betriebsdokumentation .

Leonid Beschastny
quelle
4
dh elemMatch entspricht Auszeichnung 'und' Jahr (im Gegensatz zu Auszeichnung 'oder' Jahr)
Aditya Mittal
Wie können wir nur Dokumente abfragen, die den Vornamen John haben und auf einfache Weise als nationale Medaille ausgezeichnet werden? Wir machen es mit Aggregat und Iteration durch Awards Array, wollten aber einfache Abfrage wissen
Venkatesh Kolla - user2742897
23

Verwenden Sie $ elemMatch , um das Array eines bestimmten Objekts zu finden

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

Dies kann auf zwei Arten geschehen:

  1. ElementMatch - $elemMatch(wie in den obigen Antworten erläutert)

    db.users.find ({Auszeichnungen: {$ elemMatch: {Auszeichnung: 'Turing Award', Jahr: 1977}}})

  2. Verwenden Sie $andmitfind

    db.getCollection ('Benutzer'). find ({"$ und": [{"Awards.Award": "Turing Award"}, {"Awards.Jahr": 1977}]})

Joby Wilson Mathews
quelle