在python字典中添加新的键值对

时间:2019-09-03 11:24:12

标签: python mongodb

我在尝试在python字典中添加新的键值对同时保留以前的键值对时遇到问题。我正在使用MongoDB作为数据库。

我的示例回复是

"field1" : "a",
"field2" : "b",
"field3" : "c",
"history" : {
    "2019-09-03 00:00:00" : "state1"
}

预期的响应是

"field1" : "a",
"field2" : "b",
"field3" : "c",
"history" : {
    "2019-09-01 00:00:00" : "state1"
    "2019-09-02 00:00:00" : "state1"
    "2019-09-03 00:00:00" : "state1"
}

我想在历史记录中添加键值对,键是日期,值将是状态,但是问题是我的代码删除了以前的键值对,然后添加了新的键值对。

我正在使用mongo client将记录保存到MongoDB数据中。

这是我的代码

out = dict()
history = dict()
out['field1'] = 'a'
out['filed2'] = 'b'
out['field3'] = 'c'
history[str(datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0))] = 'state1'
out_handle.update_one(
                    {'field1': a, 'field2': 'b', 'field3': 'c'},
                    {'$set': out}},
                    upsert=True
                )

2 个答案:

答案 0 :(得分:1)

您似乎希望通过三个字段{'field1': a, 'field2': 'b', 'field3': 'c'}进行查询,然后仅添加历史记录。使用$push运算符执行此操作。请注意,update_one的第二个arg可以具有$push$set$unset个运算符。

coll.update_one({'field1': a, 'field2': 'b', 'field3': 'c'}, {
        "$push": {"history":{"D2":"S3"}},
        "$set": {"otherField1": "hello", "otherField2": "goodbye"}
        }, upsert=True)

我强烈建议您不要将日期用作键,而应将其用作值和真实的日期时间值,而不是字符串。当日期查询是一个值而不是一个键时,例如,

rec = {
    "date": datetime.datetime.now(),
    "state": "state1"  # or whatever
}
coll.update_one({'field1': a, 'field2': 'b', 'field3': 'c'}, {"$push": {"history":rec}} )

这会产生类似的内容:

{
    "field1" : "a",
    "field2" : "b",
    "field3" : "c",
    "history" : [
        {
            "date" : ISODate("2019-09-03T07:54:38.144Z"),
            "state" : "state1"
        },
        {
            "date" : ISODate("2019-09-03T07:54:38.144Z"),
            "state" : "state2"
        }
    ]
}

答案 1 :(得分:0)

这可以解决:

创建要在父词典中插入的子词典:

    history[str(datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0, day=1))] = 'state1'
    history[str(datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0, day=2))] = 'state1'
    history[str(datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0, day=3))] = 'state1'

在父“出”字典中插入子字典

    out['history']=history

效果

    {'field1': 'a',
    'filed2': 'b',
    'field3': 'c',
    'history': {'2019-09-03 00:00:00': 'state1',
    '2019-09-02 00:00:00': 'state1',
    '2019-09-01 00:00:00': 'state1'}}