2016-02-25 12 views

Trả lời

6

Chúng tôi chỉ phải nhóm trên cơ sở 2 khóa và chọn các phần tử có số lượng lớn hơn 1, để tìm các bản sao.

Query: - Sẽ là như

db.mycollection.aggregate(
    { $group: { 
     _id: { foreing: "$foreing", value: "$value" }, 
     count: { $sum: 1 }, 
     docs: { $push: "$_id" } 
    }}, 
    { $match: { 
     count: { $gt : 1 } 
    }} 
) 

OUTPUT: - Sẽ là như

{ 
    "result" : [ 
     { 
      "_id" : { 
       "foreing" : 1, 
       "value" : 2 
      }, 
      "count" : 2, 
      "docs" : [ 
       ObjectId("34567887654345678987"), 
       ObjectId("34567887654345678987") 
      ] 
     } 
    ], 
    "ok" : 1 
} 

tham khảo Link: - How to find mongo documents with a same field

9

Bạn có thể dễ dàng nhận ra các bản sao bằng chạy hoạt động đường ống tổng hợp sau:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": { "foreing": "$foreing", "value": "$value" }, 
      "uniqueIds": { "$addToSet": "$_id" }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$match": { "count": { "$gt": 1 } } } 
]) 

Các $group điều hành trong bước đầu tiên được sử dụng để nhóm các tài liệu theo các giá trị quan trọng foreignvalue và sau đó tạo ra một loạt các _id giá trị cho mỗi người trong số các tài liệu được nhóm lại như lĩnh vực uniqueIds sử dụng $addToSet nhà điều hành. Điều này cung cấp cho bạn một mảng các giá trị biểu thức duy nhất cho mỗi nhóm. Nhận tổng số tài liệu được nhóm để sử dụng trong các giai đoạn đường ống sau này với nhà điều hành $sum.

Trong giai đoạn đường ống thứ hai, hãy sử dụng toán tử $match để lọc ra tất cả tài liệu với số lượng 1. Tài liệu được lọc đại diện cho các phím chỉ mục duy nhất.

Các tài liệu còn lại sẽ là tài liệu trong bộ sưu tập có giá trị khóa trùng lặp cho cặp foreing & value.

Các vấn đề liên quan