Moğodb'da nesne dizisi nasıl aranır


207

Mongodb belgesinin (tablo) 'kullanıcılar' olduğunu varsayalım

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

'Ulusal Madalya' ödülüne sahip olan ve 1975 yılında verilmesi gereken kişiyi bulmak istiyorum. Farklı yıllarda bu ödülü alan başka kişiler de olabilir.

Bu kişiyi ödül türünü ve yılını kullanarak nasıl bulabilirim. Böylece kesin kişiyi bulabilirim.

Yanıtlar:


367

Doğru yol:

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

$elemMatch aynı dizi öğesinde birden fazla bileşeni eşleştirmenize olanak tanır.

$elemMatchMongo olmadan bir yıl içinde Ulusal Madalya sahibi olan kullanıcıları ve 1975'lerde bir miktar ödülü arayacak, ancak 1975'te Ulusal Madalyası olan kullanıcıları aramayacak.

Daha fazla bilgi için MongoDB $ elemMatch Documentation bölümüne bakın . Dizili belgeleri sorgulama hakkında daha fazla bilgi için bkz. İşlem Belgeleri .


4
yani elemMatch, 've' yıl ödülüyle (ödülün yerine 'veya' yıl) eşleşir
Aditya Mittal

sadece adının John olduğu ve ulusal madalya olarak verildiği belgeleri basit bir şekilde nasıl sorgularız? Biz toplu ve ödüller dizi üzerinden yineleme ile yapmak ama basit bir sorgu bilmek istedim
Venkatesh Kolla - user2742897

23

Belirli bir nesnenin dizisini bulmak için $ elemMatch kullanın

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

0

Bunu iki şekilde yapabilir:

  1. ElementMatch - $elemMatch(yukarıdaki cevaplarda açıklandığı gibi)

    db.users.find ({ödüller: {$ elemMatch: {ödül: 'Turing Ödülü', yıl: 1977}}})

  2. kullanımı $andilefind

    db.getCollection ('kullanıcılar'). find ({"$ and": [{"awards.award": "Turing Award"}, {"awards.year": 1977}]})

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.