MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB:Làm thế nào để tìm 10 tài liệu ngẫu nhiên trong bộ sưu tập 100?

Điều này đã được trả lời cách đây rất lâu và kể từ đó, MongoDB đã phát triển rất nhiều.

Như đã đăng trong một câu trả lời khác, MongoDB hiện hỗ trợ lấy mẫu trong Khung tổng hợp kể từ phiên bản 3.2:

Cách bạn có thể làm là:

db.products.aggregate([{$sample: {size: 5}}]); // You want to get 5 docs

Hoặc:

db.products.aggregate([
  {$match: {category:"Electronic Devices"}}, // filter the results
  {$sample: {size: 5}} // You want to get 5 docs
]);

Tuy nhiên, có một số cảnh báo về toán tử $ sample:

(kể từ ngày 6 tháng 11 năm 2017, trong đó phiên bản mới nhất là 3.4) => Nếu bất kỳ điều nào trong số này không được đáp ứng:

  • $ sample là giai đoạn đầu tiên của quy trình
  • N ít hơn 5% tổng số tài liệu trong bộ sưu tập
  • Bộ sưu tập chứa hơn 100 tài liệu

Nếu bất kỳ điều kiện nào ở trên KHÔNG được đáp ứng, $ sample sẽ thực hiện quét bộ sưu tập, sau đó sắp xếp ngẫu nhiên để chọn N tài liệu.

Giống như trong ví dụ cuối cùng với $ match

CÂU TRẢ LỜI CŨ

Bạn luôn có thể chạy:

db.products.find({category:"Electronic Devices"}).skip(Math.random()*YOUR_COLLECTION_SIZE)

Nhưng thứ tự sẽ không ngẫu nhiên và bạn sẽ cần hai truy vấn (một truy vấn để nhận được YOUR_COLLECTION_SIZE) hoặc ước tính mức độ lớn của nó (khoảng 100 bản ghi, khoảng 1000, khoảng 10000 ...)

Bạn cũng có thể thêm một trường vào tất cả các tài liệu với một số ngẫu nhiên và truy vấn theo số đó. Hạn chế ở đây là bạn sẽ nhận được cùng một kết quả mỗi khi bạn chạy cùng một truy vấn. Để khắc phục điều đó, bạn luôn có thể chơi với giới hạn và bỏ qua hoặc thậm chí với sắp xếp. bạn cũng có thể cập nhật các số ngẫu nhiên đó mỗi khi tìm nạp một bản ghi (ngụ ý có nhiều truy vấn hơn).

--Tôi không biết bạn đang sử dụng Mongoose, Mondoid hay trực tiếp là Trình điều khiển Mongo cho bất kỳ ngôn ngữ cụ thể nào, vì vậy tôi sẽ viết tất cả về mongo shell.

Vì vậy, giả sử, bản ghi sản phẩm của bạn sẽ giống như sau:

{
 _id: ObjectId("..."),
 name: "Awesome Product",
 category: "Electronic Devices",
}

và tôi khuyên bạn nên sử dụng:

{
 _id: ObjectId("..."),
 name: "Awesome Product",
 category: "Electronic Devices",
 _random_sample: Math.random()
}

Sau đó, bạn có thể làm:

db.products.find({category:"Electronic Devices",_random_sample:{$gte:Math.random()}})

sau đó, bạn có thể chạy định kỳ để cập nhật trường _random_sample của tài liệu theo định kỳ:

var your_query = {} //it would impact in your performance if there are a lot of records
your_query = {category: "Electronic Devices"} //Update 
//upsert = false, multi = true
db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)

hoặc bất cứ khi nào bạn truy xuất một số bản ghi, bạn có thể cập nhật tất cả hoặc chỉ một vài bản ghi (tùy thuộc vào số lượng bản ghi bạn đã truy xuất)

for(var i = 0; i < records.length; i++){
   var query = {_id: records[i]._id};
   //upsert = false, multi = false
   db.products.update(query,{$set:{_random_sample::Math.random()}},false,false);
}

CHỈNH SỬA

Cần biết rằng

db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)

sẽ không hoạt động tốt vì nó sẽ cập nhật mọi sản phẩm phù hợp với truy vấn của bạn với cùng một số ngẫu nhiên. Cách tiếp cận cuối cùng hoạt động tốt hơn (cập nhật một số tài liệu khi bạn truy xuất chúng)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Quản lý trực quan các tài liệu và bộ sưu tập MongoDB

  2. Có cách nào để in đầu ra shell MongoDB 'đẹp' ra một tệp không?

  3. Mẹo quản lý sao lưu MongoDB cho các cụm bị chia nhỏ

  4. Cách lập trình phân tách trước một khóa phân đoạn dựa trên GUID với MongoDB

  5. MongoError:kết nối ECONNREFUSED 127.0.0.1:27017