Получать записи на основе сопоставления пар ключ-значение и сравнения даты в Python - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующая коллекция в 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' и хотите отправить запись с самой поздней датой в другую коллекцию.Например, name: 'Swetha' одинаково в первых двух записях.Поэтому сравните между ними '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 Ответ

0 голосов
/ 10 октября 2018

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

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 шагов агрегации я попытался преобразовать в дату, а затем отсортировать по убыванию,В группе я сгруппировал с именем и взял первое, которое идет с этим именем.

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

Я предполагаю, что вам нужны дубликаты записей, и я беру первыйтот, который приходит.Справка: https://stackoverflow.com/a/26985011/7630071

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