修改MongoDB中属性的显示顺序

时间:2013-05-02 21:29:14

标签: python mongodb pymongo

我正在使用PyMongo将数据(title, description, phone_number ...)插入MongoDB。但是,当我使用mongo客户端查看数据时,它会以奇怪的顺序显示属性。具体而言,首先显示phone_number属性,然后显示title,然后显示description。有什么方法可以强制执行特定的订单吗?

2 个答案:

答案 0 :(得分:4)

原始答案(2013):

MongoDB文档是BSON对象,是键值对的无序字典。因此,您不能依赖或设置特定的字段顺序。您可以操作的唯一事项是要显示哪些字段,哪些不显示,请参阅有关find projection参数的文档。

另见SO上的相关问题:

希望有所帮助。

答案 1 :(得分:4)

上述问题和答案都很陈旧。无论如何,如果有人访问这个我觉得我应该添加:

这个答案是完全错误的。实际上在Mongo Documents中有序键值对。然而,当使用pymongo时,它将使用python dicts来确定没有排序的文件(从cpython 3.6 python dicts保留顺序,但是这被认为是实现细节)。但这是pymongo司机的限制。

请注意,此限制实际上会影响可用性。如果在db中查询子文档,只有在键值对的顺序正确时才会匹配。

请亲自尝试以下代码:

from pymongo import MongoClient
db = MongoClient().testdb
col = db.testcol
subdoc = {
   'field1': 1,
   'field2': 2,
   'filed3': 3
}
document = {
   'subdoc': subdoc
}
col.insert_one(document)
print(col.find({'subdoc': subdoc}).count())

每次执行此代码时,都会将“相同”文档添加到集合中。因此,每次我们运行此代码片段时,打印值“应该”增加1。它不是因为只找到具有正确排序的maches subdocuemnts但python dicts只是以任意顺序插入subdoc。

请参阅以下答案如何使用有序的dict来克服这个问题:https://stackoverflow.com/a/30787769/4273834