0

mongodb データベースに 2 つのコレクションがあります。例:

employee(collection)
    _id
    name
    gender
    homelocation (double[] indexed as geodata)
    companies_worked_in (reference, list of companies)

companies(collection)
    _id
    name
    ...

ここで、名前が「wha」で始まり、近くに住んでいる従業員がいる/いたすべての会社を照会する必要があります(13.444519、52.512878)。

あまり時間をかけずにそれを行うにはどうすればよいですか?SQL を使用すると、単純な結合になります (もちろん、地理空間検索は必要ありません... :( )

4

1 に答える 1

1

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つだけにインデックスを付ける必要があります。複合インデックスを作成できない場合があります。

提案 会社名も従業員コレクションに保存します。そうすれば、最初のクエリを回避できます。

于 2013-01-25T11:44:00.557 に答える