繁体   English   中英

Python MongoDB 保存集合字典

[英]Python MongoDB save dictionary of sets

我有一本要永久保存在 mongodb 数据库中的集合字典。 但是,我在保存过程中收到错误“无法编码 object: {1, 2}, of type: <class 'set'>”。 我看到一个帖子,其中一个用户的建议是将每个集合保存为一个字典,但这对我来说似乎不是一个好的解决方案。 除了将每个集合转换为列表之外,还有其他方法可以将字典与集合一起保存吗? 该字典类似于以下代码,但更复杂,并且包含数千个带有字符串键和 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))

Output:

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

是的,它是递归的,是的,它会就地破坏输入文档而不是制作副本等。对于确切的用例可能并不理想(没有更多信息不能说),但演示了原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM