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"
}

当我对查询进行解释时,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 shell 版本:2.2.0

我必须如何使用索引?

试图在 mongodb 上查找相关问题和错误,但没有取得很大成功。

4

1 回答 1

1

这将在 2.3 中扫描更少的索引:https ://jira.mongodb.org/browse/SERVER-3104

同时,我建议将每个可用性移动到其自己的文档中,而不是在一个数组中包含多个,以便更有效地查询。

于 2012-10-29T17:08:45.803 回答