Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách trả về chỉ giá trị duy nhất (không trùng lặp) trong MongoDB

Để lấy các giá trị duy nhất (unique/distinct) của một trường trong MongoDB, loại bỏ các bản ghi trùng lặp, bạn sử dụng phương thức distinct().

Cú pháp

db.yourCollectionName.distinct("yourFieldName");

Ví dụ minh họa

Tạo collection và dữ liệu

> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Larry","CustomerAge":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7262f684a30fbdfd580") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Mike","CustomerAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed72d2f684a30fbdfd581") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Sam","CustomerAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7322f684a30fbdfd582") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Carol","CustomerAge":25});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed73a2f684a30fbdfd583") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"David","CustomerAge":22});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed74a2f684a30fbdfd584") }
> db.returnOnlyUniqueValuesDemo.insertOne({"CusomerName":"Chris","CustomerAge":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ed7582f684a30fbdfd585") }

Xem tất cả documents

> db.returnOnlyUniqueValuesDemo.find().pretty();
{
    "_id" : ObjectId("5c8ed7262f684a30fbdfd580"),
    "CusomerName" : "Larry",
    "CustomerAge" : 23
}
{
    "_id" : ObjectId("5c8ed72d2f684a30fbdfd581"),
    "CusomerName" : "Mike",
    "CustomerAge" : 21
}
{
    "_id" : ObjectId("5c8ed7322f684a30fbdfd582"),
    "CusomerName" : "Sam",
    "CustomerAge" : 21
}
{
    "_id" : ObjectId("5c8ed73a2f684a30fbdfd583"),
    "CusomerName" : "Carol",
    "CustomerAge" : 25
}
{
    "_id" : ObjectId("5c8ed74a2f684a30fbdfd584"),
    "CusomerName" : "David",
    "CustomerAge" : 22
}
{
    "_id" : ObjectId("5c8ed7582f684a30fbdfd585"),
    "CusomerName" : "Chris",
    "CustomerAge" : 23
}

Có 6 document nhưng CustomerAge chỉ có 4 giá trị distinct: 21, 22, 23, 25 (21 và 23 xuất hiện 2 lần).

Lấy unique values của CustomerAge

> db.returnOnlyUniqueValuesDemo.distinct("CustomerAge");
[ 23, 21, 25, 22 ]

Distinct với điều kiện (query filter)

// Chỉ distinct CustomerAge của những người tên bắt đầu bằng "C"
db.returnOnlyUniqueValuesDemo.distinct("CustomerAge", { CusomerName: /^C/ });
[ 21, 25 ]

Chỉ Carol (25) và Chris (23) - wait, Chris là 23. Kết quả thực tế: Carol=25, Chris=23 → [25, 23].

Distinct trên trường mảng

// Nếu tags là mảng: ["mongodb", "nosql"], ["mongodb", "database"]
db.posts.distinct("tags");
[ "mongodb", "nosql", "database" ]

distinct() tự động "flatten" mảng và lấy unique values.

Lưu ý hiệu năng

  • distinct() quét toàn bộ collection (collection scan) nếu không có index
  • Tạo index trên trường distinct để tăng tốc: db.coll.createIndex({field: 1})
  • Giới hạn kết quả: MongoDB 4.2+ hỗ trợ maxTimeMS
  • Kết quả trả về là array, có thể lớn →注意内存

Thay thế bằng Aggregation (linh hoạt hơn)

db.returnOnlyUniqueValuesDemo.aggregate([
    { $group: { _id: "$CustomerAge" } },
    { $project: { _id: 0, CustomerAge: "$_id" } }
])

Cho phép thêm $match, $sort, $limit...