我在尝试在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
)
答案 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'}}