Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按日期删除Mongodb上的重复值_Python_Mongodb_Pymongo - Fatal编程技术网

Python 如何按日期删除Mongodb上的重复值

Python 如何按日期删除Mongodb上的重复值,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有两个要合并的集合。合并后,我需要删除重复的值,保留最新文档并删除旧文档 我已尝试通过聚合方法来实现这一点: self.collection.aggregate([ { '$lookup': { 'from': 'algoritmo_result', 'localField': 'slug', 'foreignField': 'slug', 'as': 'copies_res

我有两个要合并的集合。合并后,我需要删除重复的值,保留最新文档并删除旧文档

我已尝试通过聚合方法来实现这一点:

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
        },
    }
])

问题是我正在删除所有重复的值,而不仅仅是旧值。

我找到的解决方案是制作一个过滤器,在当前集合中搜索最后一个重复的文档,并比较两个对象的slug(唯一字段,也可以是_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
        ))