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

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