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

MongoDB $ rand

Trong MongoDB, $rand toán tử đường ống tổng hợp trả về một số thực ngẫu nhiên từ 0 đến 1.

Giá trị dấu phẩy động có tối đa 17 chữ số sau dấu thập phân. Mọi số 0 ở cuối đều bị bỏ đi, vì vậy số lượng chữ số có thể thay đổi.

$rand toán tử đã được giới thiệu trong MongoDB 4.4.2.

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là cats với các tài liệu sau:

 {"_id":1, "name":"Scratch"} {"_id":2, "name":"Meow"} {"_id":3, "name":"Fluffy"}  

Chúng ta có thể sử dụng $rand toán tử để tạo một số ngẫu nhiên cho mỗi con mèo:

 db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $rand: {} }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "randomNumber":0,5593964875463812} {"_id":2, "randomNumber":0,04357301703691149} {"_id":3, "randomNumber":0,7556877215199272} 

$rand toán tử không chấp nhận bất kỳ đối số nào - bạn chỉ cần gọi nó bằng cách sử dụng $rand: {} .

Ngoài ra, $rand tạo ra một số mới mỗi khi nó được gọi. Do đó, chạy mã trên nhiều lần sẽ tạo ra một số ngẫu nhiên khác nhau cho mỗi con mèo.

Để chứng minh điều này, tôi sẽ chạy lại và đây là kết quả mới:

 {"_id":1, "randomNumber":0,19672627212049873} {"_id":2, "randomNumber":0,05513133909795318} {"_id":3, "randomNumber":0,7509841462815067} 

Chúng ta có thể thấy rằng các số ngẫu nhiên khác với các số được tạo trong ví dụ trước.

Số Ngẫu nhiên Lớn hơn 1

Như đã đề cập, $rand trả về một số thực ngẫu nhiên từ 0 đến 1. Điều này là tốt nếu chúng ta không ngại nhận một số 0, theo sau là tối đa 17 chữ số thập phân ngẫu nhiên.

Nhưng nếu chúng ta muốn một số ngẫu nhiên lớn hơn 1 thì sao?

Trong những trường hợp như vậy, chúng ta có thể sử dụng $multiply toán tử để nhân kết quả của $rand .

Ví dụ:

 db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $multiply: [ { $rand: {} }, 10 ] }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "randomNumber":1.958938543288535} {"_id":2, "randomNumber":4.437057321655847} {"_id":3, "randomNumber":8.238909118372334} 

Số nguyên Ngẫu nhiên

Chúng tôi cũng có thể muốn loại bỏ phần phân số. Trong trường hợp này, chúng ta có thể sử dụng toán tử như $floor để xóa phần thập phân, do đó để lại một số nguyên.

Ví dụ:

 db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 10 ] 
                } 
              }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "name":"Scratch", "randomNumber":0} {"_id":2, "name":"Meo meo", "randomNumber":5} {"_id":3, "name":"Fluffy", "randomNumber":7} 

Đây là một lần nữa, nhưng lần này chúng tôi nhân nó với 100:

 db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 100 ] 
                } 
              }
          }
     }
   ]
) 

Kết quả:

 {"_id":1, "name":"Scratch", "randomNumber":18} {"_id":2, "name":"Meo meo", "randomNumber":62} {"_id":3, "name":"Fluffy", "randomNumber":92} 

Lưu kết quả

Như đã đề cập, $rand tạo một float ngẫu nhiên mới mỗi khi nó được gọi. Điều này là tốt nếu chúng ta muốn có một số ngẫu nhiên mới mỗi khi chúng ta chạy mã, nhưng nếu chúng ta muốn lưu trữ số ngẫu nhiên trong mỗi tài liệu thì sao?

Để lưu trữ số ngẫu nhiên trong tài liệu, chúng ta có thể sử dụng $addFields toán tử (hoặc bí danh của nó $set ) để thêm trường mới vào tài liệu.

Ví dụ:

 db.cats.aggregate(
   [
      { $set: { randomNumber: { $multiply: [ { $rand: {} }, 100 ] } } },
      { $set: { randomNumber: { $floor: "$randomNumber" } } },
      { $merge: "cats" }
   ]
) 

Trong ví dụ này, chúng tôi phân tách hoạt động trên hai $set các giai đoạn và một $merge sân khấu.

$merge giai đoạn ghi kết quả của đường ống tổng hợp vào một tập hợp cụ thể và nó phải là giai đoạn cuối cùng trong đường dẫn.

Bây giờ khi chúng tôi trả lại các tài liệu từ bộ sưu tập đó (ví dụ:bằng cách sử dụng một phương thức như find() ), chúng ta có thể thấy rằng mỗi tài liệu chứa trường mới với số ngẫu nhiên:

 db.cats.find() 

Kết quả:

 {"_id":1, "name":"Scratch", "randomNumber":61} {"_id":2, "name":"Meo meo", "randomNumber":86} {"_id":3, "name":"Fluffy", "randomNumber":73} 

Bây giờ số ngẫu nhiên là liên tục. Chúng tôi có thể trả lại tài liệu bao nhiêu lần tùy thích và số ngẫu nhiên sẽ được giữ nguyên.

Hãy chạy find() một lần nữa:

 db.cats.find() 

Kết quả:

 {"_id":1, "name":"Scratch", "randomNumber":61} {"_id":2, "name":"Meo meo", "randomNumber":86} {"_id":3, "name":"Fluffy", "randomNumber":73} 

Chính xác là cùng một số ngẫu nhiên.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 5 cách để có được tháng từ một ngày trong MongoDB

  2. MongoDB Node findone làm thế nào để xử lý không có kết quả?

  3. 5 cách để chọn hàng có giá trị tối đa cho nhóm của chúng trong SQL

  4. Mongoose - Tên bộ sưu tập Force

  5. Hiệu suất MongoDB:Chạy các hoạt động giảm thiểu bản đồ MongoDB trên các thiết bị thứ hai