2012-03-19 3 views
2

私はmongodbクエリを最適化しようとしています。私はfrom_account_id、​​、およびcreated_atのインデックスを持っています。しかし、次のクエリはフルコレクションスキャンを行います。Mongoはソート付きインデックスを使用しています

{ 
    "ts": { 
     "$date": "2012-03-18T20:29:27.038Z" 
    }, 
    "op": "query", 
    "ns": "heroku_app2281692.transactions", 
    "query": { 
     "$query": { 
      "$or": [ 
       { 
        "from_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       }, 
       { 
        "to_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       } 
      ] 
     }, 
     "$orderby": { 
      "created_at": -1 
     } 
    }, 
    "ntoreturn": 25, 
    "nscanned": 2643718, 
    "responseLength": 20, 
    "millis": 10499, 
    "client": "10.64.141.77", 
    "user": "heroku_app2281692" 
} 

私はその上に順にor、そして唯一のクエリfrom_account_idまたは​​をしない場合、それは高速です。

希望する効果を得るにはどうすればよいですか? 1つのフィールドに配列のようにaccount_id(fromとtoの両方)を保持する必要がありますか?あるいはもっと良い方法があるかもしれません。ありがとう!あなたが発見したとして

答えて

7

残念ながら、$または句は、オプティマイザのために生活が困難になることができます。

だから、あなたはカップルのオプションを持ってこの問題を回避します。そのうち:

  • クエリを2つに分割し、手動で結果をマージします。
  • 効率的なクエリを可能にするようにデータモデルを変更します。たとえば、トランザクションで参照されるすべてのアカウントの配列である「referenced_accounts」フィールドを追加することができます。
+0

+1、どちらの弾丸は固体勧告しています。 –

+0

よろしくお願いします。 –

+0

$またはMongoでは、オプティマイザはインデックスをスキップしません。入れ子の$またはステートメントのインデックスをスキップします。 https://jira.mongodb.org/browse/SERVER-3327?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs – Spencer

関連する問題