2016-04-13 16 views
0

MongoDB Scalaドライバには、JavaScriptインターフェイスのexplain()関数と同等のものがありますか?MongoDB Scalaドライバには、JavaScriptインターフェイスのexplain()関数と同等の機能がありますか?

私はMongoDBのScalaのドライバは、このようなクエリで何を思ったんだけど:

collection.find(
    and(geoWithinBox("geometry", bbox.swLon, bbox.swLat, bbox.neLon, bbox.neLat), 
    equal("properties.foo", "abc"), 
    exists("properties.bar"))) 
    .limit(100) 

MongoDBは、私が作成した地理空間インデックスを使用していないようですし、私はその理由を把握しようとしています。むしろ、すべての文書をスキャンしているようです。

{$and: [{"geometry": {$geoWithin: {$box: [ [-78,40],[-76,41] ] }}}, 
     {$and: [{"properties.foo": {$eq: "abc"}}, 
       {"properties.bar": {$exists: 1}} 
       ] 
     } 
     ] 
} 

(私はちょうど別の事をしようとしていたすぐ上のJSの最初のバージョンでnested- and秒を持っていませんでした:。少なくとも、MongoShellでクエリをJS私はこれでexplainを試みたときに私は気づいたものです)、

答えて

1

この回答は現在のMongoDB Scalaドライバv1.1.0と現在のMongoDB v3.2に基づいています。

現在、Scalaドライバによるカーソルの説明()はありません。これは、explainがドライバの通常のユースケースではないと判断されたためです。クエリインデックスのデバッグにはMongo Shellを使用することをお勧めします。詳細はMongoDB driver specを参照してください。

ただし、説明出力を得るにはまだrunCommandを使用できます。モンゴシェルで$geoWithinクエリの例:

db.collection.find({ 
    "geometries":{ 
     $geoWithin:{ 
      $box:[[-78,40], [-76, 41]] 
     } 
    } 
}).explain() 

あなたは以下のようにScalaでは同じ使用してコマンドを実行できます。

val command = Document("explain" -> Document("find"->"collection", 
         "filter"->Document("geometries"->Document(
           "$geoWithin"->Document(
            "$box"->Seq(Seq(-78, 40), Seq(-76, 41)) 
           ) 
          ) 
         ) 
        ) 
       ) 
val observable = db.runCommand(command).printHeadResult() 

または凝集のためにのみ言及する価値

db.runCommand(
    Document(
     "aggregate" -> "collection", 
     "pipeline" -> List[Document](...), 
     "explain" -> true 
    ) 
) 

を照会します2d地理空間インデックスは$boxオペレータをサポートします。フィールドgeometriesに適切なインデックスがあることを確認してください。

また、デフォルトでクエリは暗黙的にANDで構成されているため、明示的に$andを指定する必要はありません。あなたの例を短縮することができます:

db.collection.find({"geometry": {$geoWithin: {$box: [[-78,40],[-76,41]] }}, 
        "properties.foo" : "abc", 
        "properties.bar": {$exists:true} 
        }) 
+0

恐ろしい、ありがとう!私は2dsphereインデックスを使うことができるように、多角形を使用するようにボックスクエリを変更しました。私はrunCommandについて知らなかった。あなたは大きな助けになりました。 – gknauth

関連する問題