Python MongoDB 保存集合字典
Python MongoDB save dictionary of sets
我有一个集合字典,我想将其永久保存在 mongodb 数据库中。但是,我在保存过程中收到错误“无法编码对象:{1, 2},类型:”。我看到一个 post,其中一位用户的建议是将每个集合保存为一个字典,但这对我来说似乎不是一个好的解决方案。除了将每个集合转换为列表之外,还有其他方法可以用集合保存字典吗?字典看起来像下面的代码,但更复杂,有数千个带有字符串键和 set() 值的条目:
{'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
MongoDB 曾经使用 SONManipulators 来转换进出数据库的文档,但它们在 4.0 中已被弃用......因此您必须将 set
预处理为对象以进行保存和在加载时恢复它们。
示例:
test = {'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
def unsetify(doc):
for k, v in doc.items():
if isinstance(v, dict):
doc[k] = unsetify(v)
elif isinstance(v, set):
doc[k] = { '_type': 'set', '_val': list(v) }
return doc
def resetify(doc):
for k, v in doc.items():
if isinstance(v, dict):
if v.get('_type', '') == 'set':
doc[k] = set(v['_val'])
else:
doc[k] = resetify(v)
return doc
doc = unsetify(test)
print(doc)
print(resetify(doc))
输出:
{'One': {'_type': 'set', '_val': [1, 2]}, 'Two': {'_type': 'set', '_val': [3, 4]}, 'Three': {'_type': 'set', '_val': [5, 6]}}
{'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
是的,它是递归的,是的,它会就地破坏输入文档而不是制作副本等。对于确切的用例可能不是理想的(不能说没有更多信息)但演示了原理。
我有一个集合字典,我想将其永久保存在 mongodb 数据库中。但是,我在保存过程中收到错误“无法编码对象:{1, 2},类型:
{'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
MongoDB 曾经使用 SONManipulators 来转换进出数据库的文档,但它们在 4.0 中已被弃用......因此您必须将 set
预处理为对象以进行保存和在加载时恢复它们。
示例:
test = {'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
def unsetify(doc):
for k, v in doc.items():
if isinstance(v, dict):
doc[k] = unsetify(v)
elif isinstance(v, set):
doc[k] = { '_type': 'set', '_val': list(v) }
return doc
def resetify(doc):
for k, v in doc.items():
if isinstance(v, dict):
if v.get('_type', '') == 'set':
doc[k] = set(v['_val'])
else:
doc[k] = resetify(v)
return doc
doc = unsetify(test)
print(doc)
print(resetify(doc))
输出:
{'One': {'_type': 'set', '_val': [1, 2]}, 'Two': {'_type': 'set', '_val': [3, 4]}, 'Three': {'_type': 'set', '_val': [5, 6]}}
{'One': {1, 2}, 'Two': {3, 4}, 'Three': {5, 6}}
是的,它是递归的,是的,它会就地破坏输入文档而不是制作副本等。对于确切的用例可能不是理想的(不能说没有更多信息)但演示了原理。