2011-07-29 24 views
10

Xin lỗi nếu điều này đã được yêu cầu trước đó. Tôi không thể tìm ra câu trả lời dứt khoát. Tôi có thể truy vấn trên một chỉ mục mongodb nếu truy vấn của tôi chứa toán tử $ hay không? Truy vấn của tôi trông giống như sau:

// find everything in the collection 
    $cursor = $collection->find(array(
    '$or' => array( 
     array('album_id' => array(
      '$in' => $this->my_album_ids 
      ), 
     'type' => array(
      '$in' => array('like','comment') 
      ) 
     ), 
     array(
    'user_id' => (int)session_item('user_id'), 
     'type' => 'message', 
     'reply' => 'no' 
     ) 
     ), 
     'timestamp' => array('$gt' => (int)$since)))->sort(array('timestamp'=>-1))->skip($start)->limit($amount); 

Ví dụ bằng PHP, nhưng tôi đoán điều này có thể áp dụng cho bất kỳ ngôn ngữ nào.

Cập nhật:

Sau đây là những chỉ số của tôi, nhưng các truy vấn trên không sử dụng chúng. Nó có vẻ đúng với tôi mặc dù.

$collection->ensureIndex(array(
     'album_id' => 1, 
     'type' => 1, 
     'timestamp' => -1, 
    )); 

    $collection->ensureIndex(array(
     'user_id' => 1, 
     'type' => 1, 
     'reply' => 1, 
     'timestamp' => -1, 
    )); 

Đây là tôi giải thích()

Array 
(
    [cursor] => BasicCursor 
    [nscanned] => 12 
    [nscannedObjects] => 12 
    [n] => 6 
    [scanAndOrder] => 1 
    [millis] => 0 
    [nYields] => 0 
    [nChunkSkips] => 0 
    [isMultiKey] => 
    [indexOnly] => 
    [indexBounds] => Array 
     (
     ) 

    [allPlans] => Array 
     (
      [0] => Array 
       (
        [cursor] => BasicCursor 
        [indexBounds] => Array 
         (
         ) 

       ) 

     ) 

    [oldPlan] => Array 
     (
      [cursor] => BasicCursor 
      [indexBounds] => Array 
       (
       ) 

     ) 

) 

Trả lời

6

Vâng, một $ hoặc truy vấn sẽ sử dụng chỉ số cho phù hợp. Ví dụ:

> db.test.ensureIndex({a:1}) 
> db.test.ensureIndex({b:1}) 
> db.test.find({$or:[{a:1}, {b:2}]}).explain() 
{ 
     "clauses" : [ 
       { 
         "cursor" : "BtreeCursor a_1", 
         "nscanned" : 0, 
         "nscannedObjects" : 0, 
         "n" : 0, 
         "millis" : 0, 
         "nYields" : 0, 
         "nChunkSkips" : 0, 
         "isMultiKey" : false, 
         "indexOnly" : false, 
         "indexBounds" : { 
           "a" : [ 
             [ 
               1, 
               1 
             ] 
           ] 
         } 
       }, 
       { 
         "cursor" : "BtreeCursor b_1", 
         "nscanned" : 0, 
         "nscannedObjects" : 0, 
         "n" : 0, 
         "millis" : 1, 
         "nYields" : 0, 
         "nChunkSkips" : 0, 
         "isMultiKey" : false, 
         "indexOnly" : false, 
         "indexBounds" : { 
           "b" : [ 
             [ 
               2, 
               2 
             ] 
           ] 
         } 
       } 
     ], 
     "nscanned" : 0, 
     "nscannedObjects" : 0, 
     "n" : 0, 
     "millis" : 1 
} 
+1

mát, rất tốt để biết đó là có thể. Tuy nhiên truy vấn và chỉ mục của tôi dường như vẫn bỏ qua nhau. Tôi đã cập nhật bài đăng của mình với cách tạo chỉ mục. Tôi có làm điều gì sai? Cảm ơn. – noel

+0

Rất có thể một trong các điều khoản bên trong của bạn không đủ điều kiện cho các chỉ mục được chỉ định. Bạn đã giải thích() trên các phần riêng biệt và xem liệu nó có sử dụng chỉ mục chính xác không? Thật hữu ích khi đăng câu hỏi trong cú pháp trình bao thay vì ngôn ngữ cụ thể. Tôi không thể đọc hầu hết những điều trên mà không cần nỗ lực nhiều hơn tôi sẵn sàng để tham gia;) –

+0

Nếu tôi là bạn, tôi sẽ làm việc qua từng phần truy vấn của bạn bằng cách xây dựng nó chậm, không có mệnh đề HOẶC. Chứng minh cho bản thân bạn rằng thứ tự trong các chỉ mục phức hợp của bạn là chính xác. Sau đó tiếp tục xây dựng đến truy vấn cuối cùng bạn cần. Tôi chắc chắn vấn đề của bạn sẽ nhanh chóng được giải quyết. –

4

Mongo không sử dụng IndexBounds trên một OR được sắp xếp. Hãy thử

db.test.find({$or:[{a:1}, {b:2}]}).sort(somesort).explain(); 

và IndexBounds sử dụng với $minElement$maxElement

Các vấn đề liên quan