Получать записи на основе сопоставления пар ключ-значение и сравнения даты в Python

У меня есть следующая коллекция в MongoDB:

{
    "_id" : ObjectId("5bbc86e5c16a27f1e1bd39f8"),
    "name" : "swetha",
    "nameId" : 123,
    "source" : "Blore",
    "sourceId" : 10,
    "LastUpdate" : "10-Oct-2018"
}
{
    "_id" : ObjectId("5bbc86e5c16a27f1e1bd39f9"),
    "name" : "swetha",
    "nameId" : 123,
    "source" : "Mlore",
    "sourceId" : "11",
    "LastUpdate" : "11-Oct-2018"
}
{
    "_id" : ObjectId("5bbc86e5c16a27f1e1bd39fa"),
    "name" : "swathi",
    "nameId" : 124,
    "source" : "Mlore",
    "sourceId" : "11",
    "LastUpdate" : "9-Oct-2018"
}

Я новичок в Python и хочу сравнить "LastUpdate" между вышеуказанными записями на основе совпадения "name" или "nameId" и хочу отправить запись с последней датой в другую коллекцию. Например, имя: "Света" одинаково в первых двух записях. Поэтому сравните "LastUpdate" между ними и выведите запись с самой последней датой.

Я написал следующий код, чтобы прочитать записи данных из MongoDB и распечатать. Я не понимал, как сравнивать записи в одном ключе и сравнивать их временную метку, хотя я ссылался на несколько ресурсов в Google.

import json
import pandas as pd
from pymongo import MongoClient

try: 
    client = MongoClient() 
    print("Connected successfully!!!") 
except:   
    print("Could not connect to MongoDB") 

# database 
db = client.conn
collection = db.contactReg
df = collection.find()
for row in df:
    print(row)

Ссылки, которые являются реф

Есть ли лучший способ сравнить значения словаря

https://gis.stackexchange.com/questions/87276/how-to-compare-values-from-a-column-in-attribute-table-with-values-in-dictionary

Сравнение двух словарей и пары значений ключа печати в python и еще немного.

1 ответ

Решение

Я думаю, что вам нужно, это агрегация. Это может показаться большим, но как только вы освоите агрегацию монго, вам станет комфортно.

df = collection.aggregate([
    {
        "$project": {
            "_id": 0,
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1,
            "LastUpdateArray": {
                "$split": [
                    "$LastUpdate",
                    "-"
                ]
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1,
            "LastUpdateArray": 1,
            "LastUpdateMonth": {
                "$arrayElemAt": [
                    "$LastUpdateArray",
                    1
                ]
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1,
            "Year": {
                "$arrayElemAt": [
                    "$LastUpdateArray",
                    2
                ]
            },
            "Date": {
                "$arrayElemAt": [
                    "$LastUpdateArray",
                    0
                ]
            },
            "Month": {
                "$switch": {
                    "branches": [
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Jan"
                                ]
                            },
                            "then": "01"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Feb"
                                ]
                            },
                            "then": "02"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Mar"
                                ]
                            },
                            "then": "03"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Apr"
                                ]
                            },
                            "then": "04"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "May"
                                ]
                            },
                            "then": "05"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Jun"
                                ]
                            },
                            "then": "06"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Jul"
                                ]
                            },
                            "then": "07"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Aug"
                                ]
                            },
                            "then": "08"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Sep"
                                ]
                            },
                            "then": "09"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Oct"
                                ]
                            },
                            "then": "10"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Nov"
                                ]
                            },
                            "then": "11"
                        },
                        {
                            "case": {
                                "$eq": [
                                    "$LastUpdateMonth",
                                    "Dec"
                                ]
                            },
                            "then": "12"
                        }
                    ],
                    "default": "01"
                }
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1,
            "Year": 1,
            "Date": 1,
            "Month": 1,
            "DateString": {
                "$concat": [
                    "$Year",
                    "-",
                    "$Month",
                    "-",
                    "$Date"
                ]
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1,
            "Date": {
                "$dateFromString": {
                    "dateString": "$DateString"
                }
            }
        }
    },
    {
        "$sort": {
            "Date": -1
        }
    },
    {
        "$group": {
            "_id": "$name",
            "name": {
                "$first": "$name"
            },
            "nameId": {
                "$first": "$nameId"
            },
            "source": {
                "$first": "$source"
            },
            "sourceId": {
                "$first": "$sourceId"
            },
            "LastUpdate": {
                "$first": "$LastUpdate"
            },
            "Date": {
                "$first": "$Date"
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "nameId": 1,
            "source": 1,
            "sourceId": 1,
            "LastUpdate": 1
        }
    }
])

Первые 5 шагов агрегации я попытался преобразовать в дату, а затем отсортировать по убыванию. В группе я сгруппировался с именем и взял первое, что идет с этим именем.

Надеюсь это поможет.

Я предполагаю, что вам нужны дубликаты записей, и я беру первую, которая приходит. Ссылка: /questions/11785196/najti-dublikatyi-zapisej-v-mongodb/11785203#11785203

df = collection.aggregate([
    {
        "$group": {
            "_id": "$name",
            "count": {
                "$sum": 1
            },
            "data": {
                "$push": {
                    "nameId": "$nameId",
                    "source": "$source",
                    "sourceId": "$sourceId",
                    "LastUpdate": "$LastUpdate"
                }
            }
        }
    },
    {
        "$match": {
            "_id": {
                "$ne": null
            },
            "count": {
                "$gt": 1
            }
        }
    }
])
Другие вопросы по тегам