2014-11-18 15 views
55

Làm cách nào để tìm các trường trùng lặp trong bộ sưu tập mongo.Tìm các bản ghi trùng lặp trong MongoDB

Tôi muốn kiểm tra xem có bất kỳ trường "tên" nào trùng lặp hay không.

{ 
    "name" : "ksqn291", 
    "__v" : 0, 
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"), 
    "channel" : "Sales" 
} 

Rất cám ơn!

Trả lời

14

Bạn có thể tìm list của duplicate tên sử dụng aggregate đường ống sau:

  • Group tất cả các hồ sơ có tương tự name.
  • Match những người đó groups có hồ sơ lớn hơn 1.
  • Sau đó, group một lần nữa để project tất cả các tên trùng lặp dưới dạng array.

Bộ luật:

db.collection.aggregate([ 
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}}, 
{$match:{"count":{$gt:1}}}, 
{$project:{"name":1,"_id":0}}, 
{$group:{"_id":null,"duplicateNames":{$push:"$name"}}}, 
{$project:{"_id":0,"duplicateNames":1}} 
]) 

o/p:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] } 
95

Sử dụng kết hợp trên name và nhận name với count > 1:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } }, 
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} } 
) 

Để sắp xếp kết quả theo nhất ít nhất là sao chép es:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } }, 
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} }, 
    {"$project": {"name" : "$_id", "_id" : 0} }  
) 

Để sử dụng với tên cột khác hơn là "tên", thay đổi "$ name" thành "$ column_name"

+1

'" $ match ": {" _id ": {" $ ne ": null}' - không cần thiết ở đây, vì phần thứ hai của câu lệnh sẽ đủ kết quả lọc. Vì vậy, chỉ kiểm tra nhóm có 'count> 1' sẽ thực hiện. – BatScream

+3

Tks @BatScream. {"$ ne": null} chỉ có trong trường hợp 'name' là null hoặc không tồn tại. Tập hợp sẽ đếm null là tốt. – anhlc

+1

Chào mừng. Nhưng tại sao lại kiểm tra trường '_id'. Nó luôn được bảo đảm là không rỗng sau thao tác 'nhóm'. – BatScream

-1
db.collectionName.aggregate([ 
{ $group:{ 
    _id:{Name:"$name"}, 
    uniqueId:{$addToSet:"$_id"}, 
    count:{"$sum":1} 
    } 
}, 
{ $match:{ 
    duplicate:{"$gt":1} 
} 
} 
]); 

Đầu tiên Nhóm Query nhóm theo các lĩnh vực .

Sau đó, chúng tôi kiểm tra Id duy nhất và đếm nó, Nếu số lớn hơn 1 thì trường sẽ trùng lặp trong toàn bộ tập hợp để điều đó được xử lý bởi truy vấn đối sánh $.

+0

không thể làm được cái này để làm việc cho tôi – cpres

+0

cũng không thể làm cái này làm việc cho tôi nữa. Bỏ phiếu xuống! –

2

Câu trả lời mà anhic đưa ra có thể rất kém hiệu quả nếu bạn có cơ sở dữ liệu lớn và tên thuộc tính chỉ xuất hiện trong một số tài liệu.

Để cải thiện hiệu quả, bạn có thể thêm $ khớp với tập hợp.

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } }, 
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} } 
) 
Các vấn đề liên quan