Trong MongoDB, distinct
Lệnh tổng hợp tìm các giá trị riêng biệt cho một trường được chỉ định trên một tập hợp duy nhất.
Nó trả về một tài liệu có chứa một mảng các giá trị riêng biệt, cũng như một tài liệu được nhúng với thống kê truy vấn và kế hoạch truy vấn.
Các giá trị khác biệt là những giá trị có các bản sao thừa bị loại bỏ. Giá trị khác biệt là giá trị duy nhất. Ví dụ:nếu bạn có 2 hoặc 3 tài liệu có cùng giá trị, thì distinct
lệnh sẽ chỉ trả về một giá trị.
Ngoài ra còn có một db.collection.distinct()
, là một phương thức trình bao bọc cho distinct
lệnh.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là pets
với các tài liệu sau.
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
Chúng ta có thể sử dụng distinct
lệnh để trả về các loại vật nuôi riêng biệt.
distinct
lệnh chấp nhận tập hợp là trường đầu tiên và khóa là trường thứ hai. Chìa khóa là trường trả về các giá trị riêng biệt.
db.runCommand ( { distinct: "pets", key: "type" } )
Kết quả:
{ "values" : [ "Bat", "Cat", "Dog" ], "ok" : 1 }
Trong ví dụ này, mặc dù có bốn con chó và hai con mèo trong bộ sưu tập, mảng chỉ chứa một con trong số đó. distinct
lệnh loại bỏ các giá trị trùng lặp.
Tài liệu gốc chỉ có một con dơi và vì vậy distinct
lệnh không thay đổi điều đó - không có giá trị trùng lặp nào để loại trừ.
Tài liệu được nhúng
Bạn có thể sử dụng ký hiệu dấu chấm để nhận các giá trị khác biệt từ một trường được nhúng
Giả sử chúng ta có một bộ sưu tập được gọi là products
chứa các tài liệu sau:
{ "_id" : 1, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : { "name" : "Shirt", "color" : "Green" }, "sizes" : [ "S", "M", "XL" ] } { "_id" : 3, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 4, "product" : { "name" : "Shorts", "color" : "Green" }, "sizes" : [ "M", "XS" ] } { "_id" : 5, "product" : { "name" : "Shorts", "color" : "Brown" }, "sizes" : [ "S", "M" ] } { "_id" : 6, "product" : { "name" : "Cap", "color" : "Purple" }, "sizes" : [ "M" ] } { "_id" : 7, "product" : { "name" : "Shoes", "color" : "Brown" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 8, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "M", "L", "XL" ] } { "_id" : 9, "product" : { "name" : "Cap", "color" : "Green" }, "sizes" : [ "M", "L" ] }
Chúng tôi có thể sử dụng truy vấn sau để trả về các giá trị khác biệt cho tên sản phẩm.
db.runCommand ( { distinct: "products", key: "product.name" } )
Kết quả:
{ "values" : [ "Cap", "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
Chúng ta có thể làm điều tương tự đối với color
trường.
db.runCommand ( { distinct: "products", key: "product.color" } )
Kết quả:
{ "values" : [ "Brown", "Green", "Purple", "White" ], "ok" : 1 }
Nhận các giá trị riêng biệt từ một mảng
Đây là cách sử dụng distinct
lệnh để nhận các giá trị khác biệt từ mảng trên.
db.runCommand ( { distinct: "products", key: "sizes" } )
Kết quả:
{ "values" : [ "L", "M", "S", "XL", "XS" ], "ok" : 1 }
Sử dụng distinct
với một Truy vấn
Bạn có thể cung cấp một truy vấn để chỉ định các tài liệu mà từ đó lấy các giá trị riêng biệt. Để thực hiện việc này, hãy thêm truy vấn sau khóa.
Ví dụ:
db.runCommand ( {
distinct: "products",
key: "product.name",
query: { "sizes": "S" }
} )
Kết quả:
{ "values" : [ "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
Thông tin thêm
distinct
lệnh cũng chấp nhận các trường khác, chẳng hạn như comment
, readConcern
và collation
(cho phép bạn chỉ định các quy tắc theo ngôn ngữ cụ thể để so sánh chuỗi, chẳng hạn như quy tắc cho chữ cái viết hoa và dấu trọng âm).
Xem tài liệu MongoDB để biết thêm thông tin.