使用pymongo从mongo检索文档时的有序属性?

时间:2012-08-14 21:08:02

标签: python mongodb

当我将以下文档存储到mongo中时,类似于:

{
name: Somename,
profile: Someprofile
}

当我使用find_one()时:

我得到的结果如下:

{
profile: Someprofile,
_id: 35353432326532(random mongo id),
name: Somename
}

在python中是否有某种方式,当我在find_one之前或之后执行某些操作时,我可以在json字符串中得到一个结果,如下所示:

{
_id: 35353432326532(random mongo id),
name: Somename,
profile: Someprofile
}

我尝试使用如下的OrderedDict,但它似乎没有帮助。

somedocument = db.mycollection
theordereddict = OrderedDict(data_layer.find_one())
print str(theordereddict)

如何在属性方面以正确的顺序获取输出字符串?在我将文档插入数据库之前,此命令是否由其他内容决定?

2 个答案:

答案 0 :(得分:0)

collections.OrderedDict没有订购仅保留订单的密钥,您需要按照要检索的顺序将密钥插入其中。

d = data_layer.find_one()
def key_function(tuple):
    """This defines the sort order for the sorted builtin"""
    return tuple[0]
sorted_dict = collections.OrderedDict((k,v) for k, v in sorted(d.items(),
                                                               key=key_function))     

也就是说,看起来print str(sorted_dict)没有为您提供所需的输出。我认为您需要手动构建已排序的字符串表示。 E.g:

s = "{" + ",".join(["%s:%s" for k,v in sorted(d.items(), key=key_function)]) + "}"

答案 1 :(得分:0)

基本上与@Mike Steder的答案相同,但可能不那么花哨,更清晰:

import json
from collections import OrderedDict

theordereddict = OrderedDict()
d = data_layer.find_one()
for k in sorted(d.keys()):
    theordereddict[k] = d[k]

json.dumps(theordereddict)