【问题标题】:Preserve key-value order of mongo document using Pymongo使用 Pymongo 保留 mongo 文档的键值顺序
【发布时间】:2015-11-02 23:03:34
【问题描述】:

我正在尝试使用 pymongo 从 mongodb 读取文档,并保持顺序键值,如 link 中所述。

from bson import CodecOptions, SON
opts = CodecOptions(document_class=SON)
collect = db.get_collection(type)
coll = collect.with_options(codec_options=opts)
cursor = coll.find({'abc': 'xyz'})

但是在 find() 查询的结果中仍然没有维护键值顺序。有什么建议/解决方法来解决这个问题?

编辑:基本上我的意思是我从 mongo find 查询得到的文档应该是原样。不应该改变顺序。

【问题讨论】:

标签: python mongodb pymongo


【解决方案1】:

它在 pymongo (3.0.3) 中对我来说很好用:

  • 可能您在插入文档时没有使用 SON?
  • 提示:您可以在 MongoClient 中将 SON 指定为 document_class,如 here 所述,然后所有文档都将作为 SON 对象检索

from bson import CodecOptions, SON
docson= SON([(j,i) for i,j in enumerate('abcdefghijklmnopqrstuvwxyz')])
docson
SON([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('h', 7), ('i', 8), ('j', 9), ('k', 10), ('l', 11), ('m', 12), ('n', 13), ('o', 14), ('p', 15), ('q', 16), ('r', 17), ('s', 18), ('t', 19), ('u', 20), ('v', 21), ('w', 22), ('x', 23), ('y', 24), ('z', 25)])
db.test.insert_one(docson)
opts = CodecOptions(document_class=SON)
colson = db.test.with_options(codec_options=opts)
colson.find_one({'a': 0})
SON([(u'_id', ObjectId('55c92bc2993000171429eff6')), (u'a', 0), (u'b', 1), (u'c', 2), (u'd', 3), (u'e', 4), (u'f', 5), (u'g', 6), (u'h', 7), (u'i', 8), (u'j', 9), (u'k', 10), (u'l', 11), (u'm', 12), (u'n', 13), (u'o', 14), (u'p', 15), (u'q', 16), (u'r', 17), (u's', 18), (u't', 19), (u'u', 20), (u'v', 21), (u'w', 22), (u'x', 23), (u'y', 24), (u'z', 25)])

【讨论】:

  • opts = CodecOptions(document_class=SON) colson = db.test.with_options(codec_options=opts) 没有帮助,我认为它只适用于 pymongo shell..?
  • @user3366706 不,它适用于 pymongo 我的例子是 python 与 shell 无关。只要您插入的文档也是 SON 对象,它就可以工作。
  • 是的,很抱歉打扰你们.. 这是代码的其他部分的问题,我的意思是我正在使用 json_util.dumps 并加载查询结果导致键值的顺序更改..实际上问题中的代码现在可以正常工作了...感谢您的时间...
  • 在查询结果上使用 json_util 是实际问题
猜你喜欢
  • 2011-08-02
  • 2015-11-18
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多