2つのクエリを発行できます。(私が書いたクエリはJavaScriptで書かれています)
最初のクエリは、名前が。で始まるすべての会社を抽出しますwha
。
db.companies.find({name: {$regex: "^wha"}}, {_id: 1})
2番目のクエリは次のようになります
db.employees.find({homelocation: {$near: [x,y]}, companies_worked_in: {$in: [result_from_above_query]} }, {companies_worked_in: 1})
ここで、companys_worked_inをフィルタリングし、名前が。で始まる会社のみを指定しwha
ます。この場合、最初のクエリは役に立たないようです。ただし、多くのレコードは$inクエリでフィルタリングされます。
この2つのクエリの間に中間コードを記述しなければならない場合があります。私はこれが単一のクエリソリューションではないことを知っています。ただし、これは1つの可能な方法であり、インデックスを作成するフィールドによってはパフォーマンスも良好です。この場合、name
(会社のコレクション)とhomelocation
(geo-index)+ companies_worked_in
(従業員のコレクション)にインデックスを作成すると、パフォーマンスを向上させることができます。
PSどちらも配列であるため、homelocation
と
の上に複合インデックスを作成できるかどうかは疑問です。companies_worked_in
これらのフィールドの1つだけにインデックスを付ける必要があります。複合インデックスを作成できない場合があります。
提案
会社名も従業員コレクションに保存します。そうすれば、最初のクエリを回避できます。