为了账号安全,请及时绑定邮箱和手机立即绑定

在 python dict 中添加新的键值对

在 python dict 中添加新的键值对

蛊毒传说 2022-05-19 14:20:46
我在尝试在 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 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

看起来您希望通过三个字段进行查询{'field1': a, 'field2': 'b', 'field3': 'c'},然后只需添加一条历史记录。与$push操作员一起这样做。注意第二个参数update_one可以有$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"

        }

    ]

}


查看完整回答
反对 回复 2022-05-19
?
慕后森

TA贡献1802条经验 获得超5个赞

这可以是解决方案:


创建子字典以插入父字典:


    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”字典中插入子字典


    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'}}


查看完整回答
反对 回复 2022-05-19
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信