2011-11-21 28 views
30

Tôi biết MongoDB có thể xử lý nhiều yêu cầu/giây, nhưng giả sử tôi phải truy vấn rất nhiều tài liệu của một tập hợp được cung cấp bởi _id; những gì âm thanh tốt hơn: làm cho một $ trong thuộc tính _id với tất cả các id tôi muốn nhận được, hoặc lặp qua các truy vấn findOne?

Trả lời

32

Tôi chắc chắn sẽ sử dụng truy vấn $ in và cung cấp một mảng các _ids.

Ví dụ:

db.collection.find({ 
    "key": { 
     "$in": [ 
      ObjectId("xxx"), 
      ObjectId("yyy"), 
      ObjectId("zzz") 
     ] 
    } 
}) 

Tại sao?

  • Nếu bạn lặp lại, có một số lượng nhất định của thiết lập và teardown cho mỗi truy vấn tạo và xả con trỏ tạo phí trên.
  • Nếu bạn không làm điều này trên một máy địa phương, nó cũng tạo ra chi phí tcp/ip cho mọi yêu cầu. Tại địa phương bạn có thể sử dụng các ổ cắm miền.
  • Có chỉ mục trên "_id" được tạo theo mặc định và thu thập nhóm tài liệu để trả về theo yêu cầu hàng loạt sẽ cực kỳ nhanh, do đó không cần phải chia nhỏ thành truy vấn nhỏ hơn.

Có một số tài liệu bổ sung here nếu bạn muốn kiểm tra.

+8

Điều gì xảy ra nếu có nhiều mục trong $ in ... nói 100 hoặc 1.000? – ewindsor

+0

@ewindsor bất cứ điều gì lên đến 1000 thường là ok. Sau đó tôi sẽ xem xét lại lược đồ bạn có và bắt đầu tính toán trước dữ liệu. –

+1

có thể '$ in' được sử dụng trên một mảng các đối tượng JSON không? –