2011-12-20 31 views
6

Tôi đang sử dụng FindAndModify trong MongoDB trong nhiều tiến trình đồng thời. Kích thước bộ sưu tập là khoảng 3 triệu mục và mọi thứ hoạt động như một vụ nổ miễn là tôi không vượt qua tùy chọn sắp xếp (bởi một trường được lập chỉ mục). Khi tôi cố gắng làm như vậy, các cảnh báo sau đây được sinh ra để các bản ghi:MongoDB FindAndModify Sorting

warning: ClientCursor::yield can't unlock b/c of recursive lock ns: test_db.wengine_queue top: 
{ 
opid: 424210, 
active: true, 
lockType: "write", 
waitingForLock: false, 
secs_running: 0, 
op: "query", 
ns: "test_db", 
query: { 
    findAndModify: "wengine_queue", 
    query: { 
      locked: { $ne: 1 }, 
      rule_completed: { $in: [ "", "0", null ] }, 
      execute_at: { $lt: 1324381363 }, 
      company_id: 23, 
      debug: 0, 
      system_id: "AK/AK1201" 
     }, 
    update: { 
      $set: { locked: 1 } 
     }, 
    sort: { 
      execute_at: -1 
     } 
}, 
client: "127.0.0.1:60873", 
desc: "conn", 
threadId: "0x1541bb000", 
connectionId: 1147, 
numYields: 0 
} 

tôi có tất cả các phím từ truy vấn lập chỉ mục, ở đây đó là:

PRIMARY> db.wengine_queue.getIndexes() 
[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1, 
     "company_id" : 1, 
     "locked" : 1, 
     "rule_completed" : 1, 
     "execute_at" : -1, 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1_company_id_1_locked_1_rule_completed_1_execute_at_-1_debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "company_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "company_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "locked" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "locked_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_completed" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_completed_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "execute_at" : -1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "execute_at_-1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "thread_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "thread_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_id_1" 
} 
] 

Có cách nào để khắc phục điều này?

+0

Nó chỉ là một cảnh báo nói rằng bản cập nhật không thể mang lại. Có điều gì thực sự ngừng hoạt động hay bạn chỉ lo lắng về cảnh báo? MongoDB/10gen có một ý kiến ​​hơi khác nhau về những gì nên và không nên là một cảnh báo đăng nhập, do đó bạn kết thúc với một vài điều đang được đăng nhập như một cảnh báo có lẽ không nên –

+0

Không, mọi thứ hoạt động tốt. Tôi lo lắng về những cảnh báo mặc dù và hàm ý nó mights có khi thiết lập của tôi được đưa đến sản xuất (khoảng 50 triệu tài liệu) – clops

+0

Nó tương đối vô tội. Tôi sẽ đăng một câu trả lời –

Trả lời

4

Đối với những người quan tâm - Tôi đã phải tạo ra một chỉ số riêng biệt kết thúc với chìa khóa mà tập là để được sắp xếp theo.

+1

Tài liệu MongoDB cho biết ["cột sắp xếp phải là cột cuối cùng được sử dụng trong chỉ mục"] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex.) –

+0

@AlexanderAzarov nó không còn có vẻ để nói điều này. – bmargulies

+1

Thật vậy. Bây giờ nó nói ["Đối với các truy vấn bao gồm một loại có sử dụng một chỉ mục hợp chất, hãy đảm bảo rằng tất cả các trường trước trường được sắp xếp đầu tiên là đối sánh bình đẳng"] (http://docs.mongodb.org/manual/applications/indexes/#use -indexes-to-sort-query-results) –

1

Đó cảnh báo được ném khi một thao tác mà muốn mang lại (ví dụ như cập nhật dài, loại bỏ, vv) không thể làm như vậy bởi vì nó không thể phát hành các khóa nó giữ vì lý do gì.

Bạn có lĩnh vực bạn đang sắp xếp trên lập chỉ mục? Nếu không thêm một chỉ mục cho điều đó có thể sẽ loại bỏ các cảnh báo.

+0

có, trường được lập chỉ mục như bạn có thể thấy từ kết quả của "getIndexes()" ở trên – clops

+0

Ah xin lỗi. Trong trường hợp đó, bạn sẽ phải sống với cảnh báo tôi nghĩ. Một lần nữa, nó chỉ là kết quả của một bản cập nhật dài mà muốn mang lại nhưng không thể. Bằng cách này có một hoặc hai chỉ số vô dụng trong đó. Lưu ý rằng chỉ mục {a: 1, b: 1, c: 1} và {a: 1} không hữu ích vì chỉ mục bao gồm chỉ mục sau. –

+0

Vì vậy, bạn đề nghị tôi chỉ giữ chỉ số hợp chất? Còn các hoạt động khác có thể chỉ sử dụng "C" hoặc "B" và "C" thì sao? – clops

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