2011-11-09 53 views
7

Tôi cần phải chọn một tài liệu từ một bộ sưu tập một cách ngẫu nhiên (cách khác - một số lượng nhỏ các tài liệu liên tiếp từ một "cửa sổ" được định vị ngẫu nhiên). Tôi đã tìm thấy hai giải pháp: 12. Việc đầu tiên là không thể chấp nhận được vì tôi dự đoán kích thước bộ sưu tập lớn và muốn giảm thiểu kích thước tài liệu. Thứ hai dường như không hiệu quả (Tôi không chắc chắn về sự phức tạp của hoạt động skip). Và here người ta có thể tìm thấy một đề cập đến truy vấn một tài liệu với một chỉ mục cụ thể, nhưng tôi không biết làm thế nào để làm điều đó (tôi đang sử dụng trình điều khiển C++).MongoDB: cách hiệu quả nhất để truy vấn một tài liệu ngẫu nhiên là gì?

Có giải pháp nào khác cho sự cố không? Đó là hiệu quả nhất?

+0

Có [yêu cầu tính năng để nhận các mặt hàng ngẫu nhiên từ bộ sưu tập] (https://jira.mongodb.org/browse/SERVER-533) trong trình theo dõi vé MongoDB. Nếu được thực thi tự nhiên, nó có thể sẽ là lựa chọn hiệu quả nhất. (Nếu bạn muốn tính năng này, hãy bỏ phiếu lên.) –

+1

Câu hỏi này đã được hỏi dưới nhiều hình thức ở đây trên Stack Overflow. Câu hỏi phổ biến nhất là [Bản ghi ngẫu nhiên từ MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) - nó có phản hồi tốt. Điều đó nói rằng, tôi nghĩ cách suy nghĩ tốt nhất về câu hỏi này không phải là suy nghĩ về việc lấy một tài liệu ngẫu nhiên mà đúng hơn là, ngẫu nhiên một tập kết quả. Xem [Đặt một tập hợp kết quả ngẫu nhiên trong Mongo] (http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo) cho điều đó. –

Trả lời

2

Tôi đã có một vấn đề tương tự cùng một lúc. Trong trường hợp của tôi, tôi có một tài sản ngày trên tài liệu của mình. Tôi biết ngày sớm nhất có thể trong tập dữ liệu vì vậy trong mã ứng dụng của mình, tôi sẽ tạo một ngày ngẫu nhiên trong phạm vi EARLIEST_DATE_IN_SET và NOW rồi truy vấn mongodb bằng truy vấn GTE trên thuộc tính ngày và chỉ giới hạn nó thành 1 kết quả.

Có một cơ hội nhỏ là ngày ngẫu nhiên sẽ lớn hơn ngày cao nhất trong tập dữ liệu, vì vậy tôi tính số tiền đó trong mã ứng dụng.

Với chỉ mục trên thuộc tính ngày, đây là truy vấn cực nhanh.

+0

Cảm ơn, tôi đã đi với tùy chọn này.Tôi vừa trình bày ứng dụng của mình, và tôi muốn tất cả các truy cập Mongo đều nhanh như chọn một tài liệu ngẫu nhiên với phương thức của bạn :) –

2

Có vẻ như bạn có thể tạo giải pháp 1 ở đó, (giả sử khóa _id của bạn là giá trị tự động), sau đó chỉ cần đếm số liệu của bạn và sử dụng nó làm giới hạn trên cho một int ngẫu nhiên trong C++, sau đó lấy hàng đó.

Tương tự như vậy, nếu bạn không có khóa tự động _id, chỉ cần tạo một khóa với kết quả của bạn .. có trường bổ sung có INT không được thêm nhiều vào kích thước tài liệu của bạn.

Nếu bạn không có một lĩnh vực tự động inc Mongo nói về làm thế nào để nhanh chóng thêm một ở đây:

Auto Inc Field.

+0

Tôi không chắc liệu mình có tự động _id hay không. Tôi đã hy vọng để tránh nó. Tài liệu của tôi có trường ID và tôi đang thực hiện 'EnsureIndex' cho trường đó mỗi khi tôi chèn tài liệu mới. Tôi mới đến Mongo, nên tôi không thể nói được. –

+0

Có thể truy vấn một tài liệu không có chỉ mục phù hợp, nhưng với chỉ mục gần nhất với chỉ mục tôi đã chỉ định không? Nó phải nhanh như truy vấn bình thường theo chỉ mục, và nó giải quyết được vấn đề của tôi. –

+0

điều với ID của Mongo là nếu bạn đang sử dụng MongoID mặc định (mà nó tạo ra) họ đang sử dụng mô hình đối tượng của BSON: http://www.mongodb.org/display/DOCS/Object+IDs. Bạn có thể ghi đè điều này mặc dù bằng cách tạo tập hợp _id của riêng bạn khi tạo tài liệu ban đầu, chỉ cần xác nhận rằng chúng luôn là duy nhất. – Petrogad

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