4

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

4

2 回答 2

6

上面的问题和答案已经很老了。无论如何,如果有人访问这个,我觉得我应该添加:

这个答案是完全错误的。实际上在 Mongo 文档中是有序的键值对。但是,当使用 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())

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

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

于 2016-09-29T19:23:35.900 回答
4

原始答案(2013):

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

另请参阅有关 SO 的相关问题:

希望有帮助。

于 2013-05-02T21:57:50.417 回答