1

MongoDB版本是2.0。

我有这样的结构集合:

  {
  "_id" : ObjectId("4fc1225eec13839b46f400e4"),
   "wb" : {
    "trip_plan" : [{
         "op_sta" : "242H",
         "in_tm" : ISODate("2012-07-30T018:00:00Z"),
         "out_tm" : ISODate("2012-07-30T19:02:00Z"),
      }, {
         "op_sta" : "10563",
         "in_tm" : ISODate("2012-07-30T20:00:00Z"),
         "out_tm" : ISODate("2012-07-30T21:00:00Z") 
       }, {
         "op_sta" : "10451",
        "in_tm" : ISODate("2012-07-31T06:00:00Z"),
        "out_tm" : ISODate("2012-07-31T08:00:00Z"),
      }]
  }
}

trip_plan arr 很大。平均长度约为30-40。但我无法在 2.0 版中获得仅匹配的记录。我的应用程序是一种编写繁重的应用程序。

收集统计信息,例如:

   {
    "ns" : "itcp.car_location",
    "count" : 476509,
    "size" : 11794651412,
    "avgObjSize" : 24752.21121112088,
    "storageSize" : 13324562416,
    "numExtents" : 34,
    "nindexes" : 17,
    "lastExtentSize" : 2146426864,
    "paddingFactor" : 1.009999999878954,
    "flags" : 0,
    "totalIndexSize" : 2178233568,
    "indexSizes" : {
        "_id_" : 22418592,
        "wb.wb_sn_1" : 19516112,
        "next_wb.wb_sn_1" : 7914368,
        "wb.trip_plan.op_sta_1_wb.trip_plan.in_trn_1_wb.trip_plan.in_orgn_dt_1" : 315757120,
        "next_wb.trip_plan.op_sta_1_next_wb.trip_plan.in_trn_1_next_wb.trip_plan.in_orgn_dt_1" : 84065632,
        "wb.trip_plan.op_sta_1_wb.trip_plan.out_trn_1_wb.trip_plan.out_orgn_dt_1" : 319387264,
        "next_wb.trip_plan.op_sta_1_next_wb.trip_plan.out_trn_1_next_wb.trip_plan.out_orgn_dt_1" : 95487504,
        "last_op-last_evt_type-status"" : 30758112,
        "modify_ts" : 22091552,
        "ActlInTrn" : 245263648,
        "ActlOutTrn" : 243301408,
        "eq_nr_init" : 23105376,
        "event_os_trn_orgnDt" : 97719552,
        "wb_ibTrn_os_ts" : 255475472,
        "wb_obTrn_os_ts" : 243056128,
        "next_wb_ibTrn_os_ts" : 76658176,
        "next_wb_ObTrn_os_ts" : 76257552
    },
    "ok" : 1
}

我的索引是这样的:

wb_obTrn_os_ts       
{
"wb.trip_plan.op_sta" : 1,
"wb.trip_plan.out_tm":1
}

当我通过以下方式进行查询时

 db.car_location.find({ "wb.trip_plan": {$elemMatch: {"op_sta" :"148H",  
        "out_tm" : {$gt: ISODate("2012-08-02T04:00:00.000Z"),       
        $lt: ISODate("2012-08-03T04:00:00.000Z")}}}} ).explain();
... ... {
    "cursor" : "BtreeCursor wb_obTrn_os_ts",
    "nscanned" : 45624,
    "nscannedObjects" : 45624,
    "n" : 2889,
    "millis" : 378954,
    "nYields" : 3858,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "wb.trip_plan.op_sta" : [
            [
                "148H",
                "148H"
            ]
        ],
        "wb.trip_plan.out_tm" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
}

我的 mongodb 服务器 RAM 是 16G 。从解释中,您可以看到它已命中索引并且没有 scanAndOrder。需要很长时间才能得到结果!!我已经被这个问题阻止了好几天了!!

非常感谢您的救援!!

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn            set repl       time
     1     50     26      0       6      48       0  76.3g   154g  11.9g    223     15.3          0       8|3     9|3   147k   525k    74 abc2g_repl_set    M   11:48:33
     0     57     40      0       3      44       0  76.3g   154g  11.9g    158     12.4          0       6|4     8|4   101k   624k    74 abc2g_repl_set    M   11:48:34
     0     43     30      0       2      36       0  76.3g   154g  11.9g     84     13.2          0       5|1     7|1    93k   442k    74 abc2g_repl_set    M   11:48:35
     0      5      6      0       6      17       0  76.3g   154g    12g    281      2.4          0       1|1     6|0    13k    63k    74 abc2g_repl_set    M   11:48:36
     0     38      9      0       7       8       0  76.3g   154g  12.1g    256      2.1          0       0|0     5|0    41k   183k    74 abc2g_repl_set    M   11:48:37
     0     44      0      0       0      29       0  76.3g   154g  12.1g    359        0          0       0|0     5|0     5k   208k    74 abc2g_repl_set    M   11:48:38
     0     17      0      0       0       1       0  76.3g   154g  12.1g    316        0          0       0|0     6|0     1k    74k    74 abc2g_repl_set    M   11:48:39
     0     27      3      0       2      11       0  76.3g   154g  12.2g    225      0.3          0       3|0     5|0    12k   161k    74 abc2g_repl_set    M   11:48:40
     0     29      5      0       4      11       0  76.3g   154g  12.2g    275      3.2          0       0|0     5|0    24k   251k    74 abc2g_repl_set    M   11:48:41
     0     42      7      0       6      27       0  76.3g   154g  12.2g    197     12.4          0       0|0     5|0    14k   245k    74 abc2g_repl_set    M   11:48:42

我应该注意哪部分信息?

4

1 回答 1

1

这里有几个快速查询/尝试你可以做

  1. 你真的想要$elemMatch吗?(你最了解它的结构!)
  2. 你可以试试聚合吗?当 $ 和 $elemMatch 在两个不同的字段(在复杂查询中)时,Mongodb 查询优化器的行为很奇怪。您可以尝试将这两个操作流水线化,它会非常快(至少在我的大多数查询中,类似类型!)
于 2012-12-09T06:47:22.123 回答