tôi tìm thấy giải pháp này làm việc với MongoDB 3.4: tôi sẽ giả định trường có trùng lặp được gọi là fieldX
db.collection.aggregate([
{
// only match documents that have this field
// you can omit this stage if you don't have missing fieldX
$match: {"fieldX": {$nin:[null]}}
},
{
$group: { "_id": "$fieldX", "doc" : {"$first": "$$ROOT"}}
},
{
$replaceRoot: { "newRoot": "$doc"}
}
],
{allowDiskUse:true})
Mới làm quen với mongoDB, tôi đã dành rất nhiều thời gian và sử dụng các giải pháp dài khác để tìm và xóa các bản sao. Tuy nhiên, tôi nghĩ giải pháp này gọn gàng và dễ hiểu.
Nó hoạt động bằng các tài liệu khớp đầu tiên có chứa fieldX (Tôi đã có một số tài liệu không có trường này và tôi có thêm một kết quả trống).
Nhóm giai đoạn tiếp theo là tài liệu theo trườngX và chỉ chèn tài liệu $first vào mỗi nhóm sử dụng $$ROOT.Cuối cùng, nó thay thế toàn bộ nhóm tổng hợp bằng tài liệu được tìm thấy bằng $ ROOT đầu tiên và $$.
Tôi phải thêm allowDiskUse vì bộ sưu tập của tôi lớn.
Bạn có thể thêm số này sau bất kỳ số lượng đường ống nào và mặc dù tài liệu cho $ first đề cập đến một giai đoạn sắp xếp trước khi sử dụng $ đầu tiên, nó làm việc cho tôi mà không có nó. "Couldnt đăng một liên kết ở đây, uy tín của tôi là ít hơn 10 :("
Bạn có thể lưu kết quả cho một bộ sưu tập mới bằng cách thêm một giai đoạn $ ra ...
Ngoài ra, nếu người duy nhất là quan tâm đến một vài lĩnh vực ví dụ field1, field2, và không phải là toàn bộ tài liệu, ở vòng bảng mà không replaceRoot:
db.collection.aggregate([
{
// only match documents that have this field
$match: {"fieldX": {$nin:[null]}}
},
{
$group: { "_id": "$fieldX", "field1": {"$first": "$$ROOT.field1"}, "field2": { "$first": "$field2" }}
}
],
{allowDiskUse:true})
Tên không nhất thiết phải là duy nhất. Điều này sẽ xóa nó chỉ khi cả hai tên và ít nhất một nút là giống nhau? – ewooycom
@ user1188570 Nó là hợp chất vì vậy cả hai lĩnh vực phải có một bản sao trong cùng một tài liệu – Sammaye
@Sammaye Tôi nghĩ rằng giải pháp tốt hơn để hợp nhất các nút, có bất cứ điều gì giống như hành động: {$ merge: nodes} thay vì dropDups? Làm thế nào bạn sẽ đạt được điều này? – ewooycom