Как убрать дублированные значения на Mongodb по дате - PullRequest
0 голосов
/ 16 октября 2019

У меня есть две коллекции, которые я хочу объединить. После слияния мне нужно удалить дублированные значения, сохранить новый документ и удалить более старые.

Я попытался сделать это с помощью агрегатного метода:

self.collection.aggregate([
    {
        '$lookup': {
            'from': 'algoritmo_result',
            'localField': 'slug',
            'foreignField': 'slug',
            'as': 'copies_result'
        }
    },
    {
        '$group': {
            '_id': '$swab', 'count': {'$sum': 1}
        }
    },
    {
        '$match': {
            'obs': {'$not': ignore_string},
            'count': 1
        },
    }
])

Проблема в том, чтоЯ удаляю все дублированные значения, а не только старые значения.

1 Ответ

0 голосов
/ 17 октября 2019

Решением, которое я нашел для этого, было создание фильтра, который ищет в текущей коллекции последний дублированный документ и сравнивает слаг (уникальное поле, также может быть _id) обоих объектов.

Это выглядит так:

    def last_duplicated_patient(self, swab):
        return self.collection.find({'swab': swab}).sort([("_id", pymongo.DESCENDING)]).limit(1)

    def aggregate_result_collection(self):
        ignore_string = re.compile('coleta', re.IGNORECASE)
        patients_with_results = list(self.collection.aggregate([
            {
                '$lookup': {
                    'from': 'algoritmo_result',
                    'localField': 'slug',
                    'foreignField': 'slug',
                    'as': 'copies_result'
                }
            },
            {
                '$match': {
                    'obs': {'$not': ignore_string},
                },
            },
        ]))
        patients_with_results = list(filter(
            lambda x: x.get('slug') == list(self.last_duplicated_patient(x.get('swab')))[0].get('slug'),
            patients_with_results
        ))
...