2016-03-08 15 views
5

đầu tiên của tất cả tôi mới đến mongo vì vậy tôi không biết nhiều và tôi không thể chỉ loại bỏ các hàng trùng lặp do một số phụ thuộc.Mongo Distinct Query với đối tượng đầy đủ hàng

Tôi có dữ liệu sau đây được lưu trữ trong Mongo

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 2, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'}, 
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'}, 
{'id': 5, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'} 

bạn có thể thấy một số các hàng là trùng lặp với id khác nhau miễn là nó sẽ làm để giải quyết vấn đề này từ đầu vào tôi phải giải quyết nó trên đầu ra.

tôi cần những dữ liệu theo cách sau:

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'}, 
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'} 

truy vấn của tôi

keys = db.collection.distinct('key', {}) 
all_data = db.collection.find({'key': {$in: keys}}) 

Như bạn có thể nhìn thấy nó mất hai truy vấn cho một kết quả tương tự thiết lập Hãy kết hợp nó với một là cơ sở dữ liệu rất lớn

Tôi cũng có thể tạo unique key trên key nhưng giá trị quá dài (152 ký tự) rằng nó sẽ không giúp tôi.

Hoặc nó sẽ ??

+0

có thể trùng lặp của [Remove Duplicates từ MongoDB] (http://stackoverflow.com/questions/ 31557053/remove-duplicates-from-mongodb) –

+0

Có thể không "chính xác" trong phần "loại bỏ", nhưng chắc chắn trong phần nhận dạng. Về cơ bản bạn cần phải '$ nhóm' trên các trường chung và sau đó trả về bất kỳ trường phụ trợ nào khác với' $ first' –

Trả lời

5

Bạn cần sử dụng khung tổng hợp cho việc này. Có nhiều cách để làm điều này, các giải pháp dưới đây sử dụng biến $$ROOT để có được những tài liệu đầu tiên cho mỗi nhóm:

db.data.aggregate([{ 
    "$sort": { 
    "_id": 1 
    } 
}, { 
    "$group": { 
    "_id": "$key", 
    "first": { 
     "$first": "$$ROOT" 
    } 
    } 
}, { 
    "$project": { 
    "_id": 0, 
    "id":"$first.id", 
    "key":"$first.key", 
    "name":"$first.name", 
    "country":"$first.country" 
    } 
}]) 
Các vấn đề liên quan