Pymongo自动排序输入字典

0 投票
2 回答
629 浏览
提问于 2025-04-17 00:09

我正在使用Pymongo来访问Mongo数据库。我想要搜索在指定位置附近的所有人,并且他们的名字中包含一个特定的字符串。例如,我想查找所有在[105.0133, 21.3434]附近,并且名字中包含'Mark'的人。所以我写了这样的查询:

db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" })

(我在我的"users"集合中有一个名为"location.coords"的索引)

这个查询在MongoDB控制台中运行得很好,但当通过Pymongo执行时,字典的顺序被重新排列成这样:

{ "name": "/Mark/", "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }

("name"这个键在"location.coords"之前,这不是我预期的顺序 - MongoDB也不期望这样)

这导致MongoDB无法理解这个查询,因此没有返回任何结果。有没有人能帮我解决这个问题,让Pymongo不要重新排序我的字典呢?

谢谢,祝好

2 个回答

0

问题不在于顺序,而是"/Mark/"。这个用斜杠包起来的写法是JavaScript环境提供的一种方便方式,并不算是正则表达式模式的一部分(除非你是想把斜杠当作字面意思的斜杠,那我就误解你的问题了)。

要在PyMongo中使用正则表达式(“包含”)过滤器,你需要传递一个Python的正则表达式对象。试试这个:

{ "name": re.compile("Mark"), "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }
0

字典这种数据类型本身是没有顺序的。根据Python文档的说法:

可以把字典看作是一组无序的键值对,要求每个键在一个字典中是唯一的。

如果你想按照特定的顺序来索引你的字典,你需要以某种方式来保存这个顺序。一个简单的方法是把你的键放在一个列表里,比如:

mongo_keys = ["location.coords", "name"]
for k in mongo_keys:
    do_something(mongo_result[k])

你可能还想了解一下

collections.OrderedDict([items])

返回一个字典的子类实例,支持通常的字典方法。OrderedDict是一个记住键最初插入顺序的字典。如果一个新条目覆盖了一个已有条目,原来的插入位置不会改变。删除一个条目然后重新插入,会把它移动到最后。

不幸的是,如果你需要更多的帮助,你需要提供更多关于你情况的细节。

撰写回答