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

MongoDB $ stdDevPop

Trong MongoDB, $stdDevPop nhà điều hành đường ống tổng hợp tính toán độ lệch chuẩn tổng thể của các giá trị đầu vào của nó.

Các giá trị đầu vào có thể từ một nhóm tài liệu (tức là các tài liệu được nhóm theo cùng một khóa) hoặc chúng có thể là nhiều trường trong một tài liệu.

Cú pháp

$stdDevPop toán tử hỗ trợ hai cú pháp.

Cú pháp 1:

{ $stdDevPop: <expression> }

Cú pháp 2:

{ $stdDevPop: [ <expression1>, <expression2> ... ]  }

Cú pháp đầu tiên chấp nhận một đối số và cú pháp thứ hai chấp nhận nhiều đối số.

Khi được sử dụng trong nhóm $group giai đoạn này, bạn chỉ có thể sử dụng cú pháp đầu tiên. Trong trường hợp này, $stdDevPop trả về độ lệch chuẩn tổng thể của biểu thức được chỉ định cho một nhóm tài liệu chia sẻ cùng một nhóm theo khóa.

Ví dụ về Cú pháp 1 (Đối số Đơn)

Dưới đây là một số ví dụ sử dụng cú pháp 1.

Tài liệu được Nhóm

Ví dụ này sử dụng $stdDevPop kết hợp với $group để trả về độ lệch chuẩn trên một nhóm tài liệu được nhóm theo khóa.

Giả sử chúng ta có một bộ sưu tập được gọi là stonks với các tài liệu sau:

{ "_id" : 1, "ticker" : "gme", "price" : 10 }
{ "_id" : 2, "ticker" : "gme", "price" : 40 }
{ "_id" : 3, "ticker" : "gme", "price" : 90 }
{ "_id" : 4, "ticker" : "gme", "price" : 180 }
{ "_id" : 5, "ticker" : "gme", "price" : 290 }
{ "_id" : 6, "ticker" : "gme", "price" : 390 }
{ "_id" : 7, "ticker" : "gme", "price" : 190 }
{ "_id" : 8, "ticker" : "gme", "price" : 90 }
{ "_id" : 9, "ticker" : "gme", "price" : 10 }
{ "_id" : 10, "ticker" : "jnj", "price" : 131 }
{ "_id" : 11, "ticker" : "jnj", "price" : 133 }
{ "_id" : 12, "ticker" : "jnj", "price" : 138 }
{ "_id" : 13, "ticker" : "jnj", "price" : 141 }
{ "_id" : 14, "ticker" : "jnj", "price" : 145 }
{ "_id" : 15, "ticker" : "jnj", "price" : 150 }
{ "_id" : 16, "ticker" : "jnj", "price" : 154 }
{ "_id" : 17, "ticker" : "jnj", "price" : 156 }
{ "_id" : 18, "ticker" : "jnj", "price" : 160 }

Chúng tôi có thể nhóm các tài liệu này theo ticker của chúng và sau đó sử dụng $stdDevPop để trả về độ lệch chuẩn tổng thể của price trường cho mỗi nhóm:

db.stonks.aggregate(
   [
     {
       $group:
          {
            _id: "$ticker",
            standardDeviation: { $stdDevPop: "$price" }
          }
     }
   ]
)

Kết quả:

{ "_id" : "gme", "standardDeviation" : 123.7380746218039 }
{ "_id" : "jnj", "standardDeviation" : 9.752492558885207 }

Chúng ta có thể thấy rằng gme có độ lệch chuẩn cao hơn nhiều so với jnj .

Mảng

Ví dụ này áp dụng $stdDevPop vào một tài liệu duy nhất có chứa một trường với một mảng giá trị.

Tùy chọn này chỉ khả dụng khi sử dụng cú pháp đối số duy nhất. Mảng bị bỏ qua khi sử dụng cú pháp nhiều đối số (thông tin thêm về điều này bên dưới).

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

{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] }
{ "_id" : 4, "player" : "Brian", "scores" : [ 7 ] }
{ "_id" : 5, "player" : "Farnsworth", "scores" : [ ] }
{ "_id" : 6, "player" : "Meg", "scores" : null }

Chúng tôi có thể áp dụng $stdDevPop đến điểm scores trường trong mỗi tài liệu:

db.players.aggregate(
   [
     {
       $project:
          {
            standardDeviation: { $stdDevPop: "$scores" }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "standardDeviation" : 2.849991049037143 }
{ "_id" : 2, "standardDeviation" : 6.968181653455625 }
{ "_id" : 3, "standardDeviation" : 5.467073155618908 }
{ "_id" : 4, "standardDeviation" : 0 }
{ "_id" : 5, "standardDeviation" : null }
{ "_id" : 6, "standardDeviation" : null }

Trong trường hợp này, ba tài liệu đầu tiên trả về độ lệch chuẩn cho các số khác nhau trong các mảng tương ứng của chúng.

Tài liệu 4 dẫn đến độ lệch chuẩn là 0 . Điều này là do chúng tôi chỉ cung cấp một số trong mảng.

Tài liệu 5 được trả về null vì chúng tôi đã cung cấp một mảng trống.

Tài liệu 6 trả về null bởi vì chúng tôi đã cung cấp null như đối số.

Ví dụ về Cú pháp 2 (Nhiều đối số)

Cú pháp thứ hai liên quan đến việc cung cấp $stdDevPop với nhiều hơn một đối số. $stdDevPop sau đó tính toán độ lệch chuẩn dựa trên tất cả các đối số được cung cấp.

Giả sử chúng ta có một tập hợp được gọi là data với các tài liệu sau:

{ "_id" : 1, "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 4 ] }
{ "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "Hey" }

Chúng ta có thể sử dụng $stdDevPop để trả về độ lệch chuẩn tổng thể của a , b , cd các trường của mỗi tài liệu:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "result" : 1.118033988749895 }
{ "_id" : 2, "result" : 0.816496580927726 }
{ "_id" : 3, "result" : 0.816496580927726 }

Tài liệu 1 trả về độ lệch chuẩn dựa trên các giá trị đầu vào của nó là 1 , 2 , 34 .

Tuy nhiên, hai tài liệu cuối cùng chỉ trả về độ lệch chuẩn cho các giá trị đầu vào của 1 , 23 . $stdDevPop toán tử đã bỏ qua d của họ lĩnh vực.

Tại sao lại như vậy?

Cách nó hoạt động là $stdDevPop bỏ qua các giá trị không phải số. Vì vậy, trong trường hợp này, nó đã bỏ qua "Hey" trong tài liệu 3 và tính toán độ lệch chuẩn tổng thể từ các trường (số) còn lại.

Đối với tài liệu 2, d của nó trường chứa một mảng. Như đã đề cập, $stdDevPop toán tử bỏ qua mảng khi sử dụng cú pháp nhiều đối số. Chính xác hơn, nó coi các mảng là các giá trị không phải số khi được sử dụng trong ngữ cảnh này. Và như đã đề cập, $stdDevPop bỏ qua các giá trị không phải số.

Nếu tất cả các giá trị không phải là số, thì $stdDevPop trả về null .

Các trường bị thiếu

Khi sử dụng cú pháp nhiều đối số, $stdDevPop bỏ qua bất kỳ trường nào bị thiếu. Có nghĩa là, nếu bạn cung cấp một trường không tồn tại, nó sẽ bỏ qua nó. Nếu không có trường nào tồn tại, thì nó trả về null .

Ví dụ:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "result" : 1.118033988749895 }
{ "_id" : 2, "result" : 0.816496580927726 }
{ "_id" : 3, "result" : 0.816496580927726 }

Trong trường hợp này, tôi đã cung cấp thêm một trường ($e ) không tồn tại trong tài liệu. $stdDevPop đã tính toán độ lệch chuẩn dựa trên các trường còn lại do tồn tại.

Tuy nhiên, đây là những gì sẽ xảy ra khi không có trong số các trường tồn tại:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevPop: [ "$x", "$y", "$z" ] }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "result" : null }
{ "_id" : 2, "result" : null }
{ "_id" : 3, "result" : null }

Kết quả là null cho tất cả các tài liệu.

Khi sử dụng cú pháp một đối số, trường bị thiếu dẫn đến null .

Ví dụ:

db.stonks.aggregate(
   [
     {
       $group:
          {
            _id: "$ticker",
            standardDeviation: { $stdDevPop: "$oops!" }
          }
     }
   ]
)

Kết quả:

{ "_id" : "gme", "standardDeviation" : null }
{ "_id" : "jnj", "standardDeviation" : null }

Các giai đoạn có sẵn

$stdDevPop có sẵn trong các giai đoạn sau:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match giai đoạn bao gồm $expr biểu hiện

Tính độ lệch chuẩn mẫu

Xem MongoDB $stdDevSamp nếu bạn cần lấy mẫu độ lệch chuẩn, trái ngược với dân số độ lệch chuẩn. Toán tử này hữu ích nếu các giá trị của bạn bao gồm một mẫu tập hợp dữ liệu để từ đó tổng quát hóa về tập hợp.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Spring Data MongoDB - Chú thích @CreateDate không hoạt động khi sử dụng với trường Id tùy chỉnh

  2. Hình ảnh trả về từ API REST luôn hiển thị bị hỏng

  3. Làm cách nào để xuất bộ sưu tập sang CSV trong MongoDB?

  4. Azure Table Vs MongoDB trên Azure

  5. Khi nào sử dụng GridFS trên MongoDB?