我正在使用Pymongo访问Mongo db。我想搜索名称中包含字符串的指定位置附近的所有人。例如,我想搜索附近的所有人[105.0133,21.3434],并且名称包含'Mark'。所以我写这样的查询:
db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" })
(我的“用户”集合中有一个索引“location.coords”)
查询在Mongodb控制台中运行正常,但是在Pymongo执行时,字典会重新排序如下:
{ "name": "/Mark/", "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }
(“name”键在“location.coords”之前,这不是我的预期 - 也是Mongodb预期的)
这导致Mongodb无法理解查询并且不返回任何结果。任何人都可以帮我弄清楚如何强迫Pymongo不重新排序我的字典。
谢谢和问候
答案 0 :(得分:0)
字典类型本质上是无序的。来自python documentation:
最好将字典视为一组无序的键:值 对,要求密钥是唯一的(在一个内 字典)。
如果您想按特定顺序索引字典,则必须以某种方式存储您的订单。一种简单的方法是将密钥保存在列表中,例如:
mongo_keys = ["location.coords", "name"]
for k in mongo_keys:
do_something(mongo_result[k])
您可能还想要investigate:
class collections.OrderedDict([items])
返回一个dict的实例 子类,支持通常的dict方法。 OrderedDict是一个词典 它会记住第一次插入密钥的顺序。如果是新条目 覆盖现有条目,保留原始插入位置 不变。删除一个条目并重新插入它将把它移动到 端。
不幸的是,如果您需要更多帮助,则需要提供有关您情况的更多详细信息。
答案 1 :(得分:0)
问题不在于排序,而是"/Mark/"
。带有正斜杠的符号是javascript shell提供的便利,并不构成正则表达式模式本身的一部分(除非你的意思是它们是字面斜杠,在这种情况下我误解了你的问题)。 / p>
要在PyMongo中使用正则表达式(“contains”)过滤器,您需要传递Python正则表达式对象。试试这个:
{ "name": re.compile("Mark"), "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }