Добавлять данные в документ только при изменении значения - PullRequest
0 голосов
/ 07 августа 2020

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

{
    _id: ObjectId('5f2d210e6c5044b23f462e1b'),
    Identifier: 'Y',
    Year: 2020,
    InsertionDate: ISODate('2020-08-07T07:44:41.095Z'),
    LastUpdateDate: ISODate('2020-08-07T07:44:41.095Z'),
    Variable1: [
        {
            Date: ISODate('2020-07-10T00:00:00.000Z'),
            Value: 6
        }
    ],
    Variable2: [
        {
            Value: 4,
            Date: ISODate('2020-07-10T00:00:00.000Z')
        },
        {
            Value: 5,
            Date: ISODate('2020-07-11T00:00:00.000Z')
        },
        {
            Value: 7,
            Date: ISODate('2020-07-11T00:00:00.000Z')
        }
    ]
},
{
    _id: ObjectId('5f2d210e6c5044b23f462e1b'),
    Identifier: 'X',
    Year: 2020,
    InsertionDate: ISODate('2020-08-07T07:44:41.095Z'),
    LastUpdateDate: ISODate('2020-08-07T07:44:41.095Z'),
    Variable1: [
        {
            Date: ISODate('2020-07-10T00:00:00.000Z'),
            Value: 6
        }
    ],

    Variable2: [
        {
            Value: 5,
            Date: ISODate('2020-07-10T00:00:00.000Z')
        },
        {
            Value: 5,
            Date: ISODate('2020-07-11T00:00:00.000Z')
        }
    ]
}

Используя следующий код, я хотел бы отдельно добавить данные в Variable1 и Variable2, учитывая тот факт, что вставленные данные отличаются от существующих данных. Проблема, с которой я сталкиваюсь с приведенным ниже кодом, заключается в том, что данные добавляются, даже если значение одинаковое, а дата отличается. Однако я хочу добавить в список только если значение изменится. Идея состоит в том, чтобы сохранять значения только тогда, когда они меняются с течением времени для каждой категории.

now = dt.datetime.utcnow()
db.collectionName.update_one({"Year": 2020, "Identifier": "X"}, 
                                     {'$addToSet': {'Variable1': {"Value": 5,
                                                                 "Date": dt.datetime(2020, 7, 11)},
                                                    'Variable2': Item(Date = dt.date(2020, 7, 10), Value = 6).to_mongo()
                                                    },
                                      "$setOnInsert": {"InsertionDate": now},
                                      "$set": {"LastUpdateDate": now},
                                     }, upsert = True)

Есть ли у вас какие-либо предложения, как решить эту проблему?

У вас также есть идея, как это сделать впоследствии агрегировать данные так, чтобы для каждого идентификатора были указаны новейшие Variable1 и Variable2?

...