Агрегирование MongoDB для удаления дубликатов на основе нескольких полей, но не удалось удалить документы с нулевыми значениями - PullRequest
0 голосов
/ 21 октября 2019

Пример моих данных:

[{"name":"Matthew","position":Nan,"age":26},
{"name":"Alice","position":"DA","age":30},
{"name":"Matthew","position":Nan,"age":26},
{"name":"Alice","position":"DA","age":30}]

Приведенные ниже коды группируют мои данные на основе «имени» и «возраста», берут только первый экземпляр и, наконец, заполняют коллекцию только уникальными документами.

Database.collection.aggregate(
    [ 
        { "$sort": { "_id": 1 } }, 
        { "$group": { 
            "_id": [{"name":"$name"},{"position":"$position"}], 
            "doc": { "$first": "$$ROOT" } 
        }}, 
        { "$replaceRoot": { "newRoot": "$doc" } },
        { "$out": collection }
    ],allowDiskUse=True)

Я ожидал, что в коллекции будет только два документа с "именем", как у Мэтью и Алисы, вот так:

[{"name":"Matthew","position":Nan,"age":26},
{"name":"Alice","position":"DA","age":30}]

Вместо этого я получил что-то вроде этого

[{"name":"Matthew","position":Nan,"age":26},
{"name":"Alice","position":"DA","age":30},
{"name":"Matthew","position":Nan,"age":26}]

Вы видите, что моим кодам не удалось распознать документы "Мэтью" как уникальные, если поля имеют значения Nan. Что мне нужно изменить в моих кодах, чтобы они работали как положено? Заранее спасибо!

* Примечание. Единственный другой вариант, который я могу теперь сделать, - это прочитать всю коллекцию как фрейм данных с Pandas и использовать .drop_duplicates, а затем отправить ее обратно в Mongodb, что очень дорого.

...