mongodbでオブジェクトの配列を検索する方法


207

mongodb document(table) 'users'が

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

「全国メダル」を受賞し、1975年に受賞しなければならない人を見つけたいと思います。別の年にこの賞を受賞している人もいるでしょう。

賞の種類と年を使用してこの人を見つけるにはどうすればよいですか。だから私は正確な人を得ることができます。

回答:


367

正しい方法は次のとおりです。

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

$elemMatch 同じ配列要素内の複数のコンポーネントを一致させることができます。

なし $elemMatchmongoが、1975年にNational Medalを使用しているユーザーは対象になりませんが、1975年にNational Medalを使用しているユーザーや1975年代に受賞したユーザーは検索されます。

詳細については、MongoDB $ elemMatchのドキュメントを参照してください。配列を使用したドキュメントのクエリの詳細については、オペレーションのドキュメントを参照してください。


4
つまり、elemMatchは、「および」年のアワードとは対照的に「または」年のアワードと一致します
Aditya Mittal

ファーストネームがJohnで、国のメダルとして賞を受賞しているドキュメントのみを簡単にクエリするにはどうすればよいですか。集計でそれを行い、awards配列を反復処理しますが、簡単なクエリを知りたかった
Venkatesh Kolla-user2742897

23

$ elemMatchを使用して特定のオブジェクトの配列を検索します

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

0

次の2つの方法でこれを行うことができます。

  1. ElementMatch- $elemMatch(上記の回答で説明したとおり)

    db.users.find({awards:{$ elemMatch:{award: 'Turing Award'、year:1977}}})

  2. 使用$andしてfind

    db.getCollection( 'users')。find({"$ and":[{"awards.award": "Turing Award"}、{"awards.year":1977}]})

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.