fat*_*sma 16 python bson pymongo data-structures
我正在尝试在Pymongo获得有序的词典.我已经读过它可以用bson.son.Son完成.文件就在这里
但是,我似乎无法使其发挥作用.谷歌没有太多关于它.关于配置pymongo的一些讨论首先告诉它使用SON对象但没有例子.一位朋友建议在你找到时传递一个参数.他不记得了.
我能够创建SON对象.但当他们插入数据库然后再回来时,他们只是简单的说法.
我不确定是什么代码示例给你,因为我真的不知道从哪里开始.每次添加新用户时,下面的代码段都会创建一个空的SON对象.'sub_users'对象也是使用SON创建的.当我从数据库中读回帐户文档时,它们只是普通的python dicts.
account['sub_users'][sub_user_name] = bson.SON()
with mongo_manager.Collection(CFG.db, 'Users') as users:
users.save(account)
Run Code Online (Sandbox Code Playgroud)
也许一个param过去找到这样的配置?这是我朋友的建议,但他不记得了.
with mongo_manager.Collection(CFG.db, 'Users') as users:
account = users.find_one({'_id': _id, 'DOC':'OrderedDict})
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Ala*_*ars 18
上面的解决方案对于旧版本的MongoDB和pymongo驱动程序是正确的,但它不再适用于pymongo3和MongoDB3 +您现在需要添加document_class=OrderedDict到MongoClient构造函数.修改pymongo3兼容性的上述答案.
from collections import OrderedDict
from pymongo import MongoClient
import bson
client = MongoClient(document_class=OrderedDict)
sample_db = client['sample']
test_col = sample_db['test']
test_col.drop()
data = OrderedDict([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0})))
test_col.drop()
data = bson.son.SON([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0})))
Run Code Online (Sandbox Code Playgroud)
输出:
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
Run Code Online (Sandbox Code Playgroud)
Omi*_*aha 14
您可以使用bson.son.SON或OrderedDict存储有序的字典.
并选择反向数据as_class=OrderedDict.
这是一个例子:
from collections import OrderedDict
from pymongo import MongoClient
import bson
client = MongoClient()
sample_db = client['sample']
test_col = sample_db['test']
test_col.drop()
data = OrderedDict([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0}, as_class=OrderedDict)))
test_col.drop()
data = bson.son.SON([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0}, as_class=OrderedDict)))
Run Code Online (Sandbox Code Playgroud)
输出:
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
Run Code Online (Sandbox Code Playgroud)