0

ドキュメントに日付範囲を埋め込むプロジェクトがあります。

次のようなもの:

{ "availabilities" : [  
  { "start_date" : ISODate("2012-06-28T00:00:00Z"), "end_date" : ISODate("2012-10-03T00:00:00Z") },     
  { "start_date" : ISODate("2012-10-08T00:00:00Z"), "end_date" : ISODate("2012-10-28T00:00:00Z") }]
}

私がする必要があるのは、次のようなクエリを使用して、特定の期間中に利用可能なすべてのドキュメントを見つけることです。

db.faces.find({"availabilities" : {"$elemMatch" : {"$and" : [{"start_date" : {"$lte" : ISODate('2012-10-01 00:00:00 UTC')}}, {"end_date" : {"$gte": ISODate('2012-10-07 00:00:00 UTC')}}]}}})

しかし、それは私のインデックスを使用しません:

{
  "v" : 1,
  "key" : {
    "availabilities.start_date" : 1,
    "availabilities.end_date" : 1
  },
  "ns" : "faces_development.faces",
  "name" : "availabilities.start_date_1_availabilities.end_date_1"
}

クエリで Explain を実行すると、indexBounds の出力が非常に奇妙で、理解できません。

{
  "cursor" : "BtreeCursor availabilities.start_date_1_availabilities.end_date_1",
  "isMultiKey" : true,
  "n" : 71725,
  "nscannedObjects" : 143019,
  "nscanned" : 143019,
  "nscannedObjectsAllPlans" : 143221,
  "nscannedAllPlans" : 143221,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 2,
  "nChunkSkips" : 0,
  "millis" : 1608,
  "indexBounds" : {
    "availabilities.start_date" : [
        [
          true,
          ISODate("2012-10-01T00:00:00Z")
        ]
      ],
    "availabilities.end_date" : [
      [
        {
          "$minElement" : 1
        },
        {
          "$maxElement" : 1
        }
      ]
    ]
  },
  "server" : "foobar.local:27017"
}

mongoDB の現在のバージョン: MongoDB シェル バージョン: 2.2.0

インデックスを使用するにはどうすればよいですか?

mongodb で関連する質問やバグを見つけようとしましたが、大きな成功はありませんでした。

4

1 に答える 1

1

これにより、2.3 でスキャンされるインデックスが少なくなります: https://jira.mongodb.org/browse/SERVER-3104

一方で、より効率的なクエリを実行するために、1 つの配列に多数の空き情報を含めるのではなく、各空き情報を個別のドキュメントに移動することをお勧めします。

于 2012-10-29T17:08:45.803 に答える