python - Pymongo 或 Mongodb 将两个相等的 python 字典视为不同的对象

请看下面几行代码和结果:

import pymongo

d1 = {'p': 0.5, 'theta': 100, 'sigma': 20}
d2 = {'theta': 100, 'sigma': 20, 'p': 0.5}

I get the following results:

d1 == d2 // Returns True

collectn.find({'goods.H': d1}).count() // Returns 33

collectn.find({'goods.H': d2}).count() // Returns 2

其中,collectn 是一个 Mongodb 集合对象。

是否有设置或查询方法,以便我获得相同的结果 对于上述两个查询?

它们本质上使用的是同一个字典(在 d1 == d2True 的意义)。我正在尝试执行以下操作: 在将记录插入数据库之前,我检查是否存在 已经存在具有要添加的确切值组合的记录。 如果是这样,那么我不想创造新的记录。但由于以上 显示的行为甚至可以得到该记录不存在 当它这样做并且重复记录被添加到数据库中时(当然,具有不同的_id 但所有其他值都是相同的,我不希望这样)。

提前感谢您的帮助。

最佳答案

mongodb 文档 here 中解释了您遇到的问题.这也与 Python 字典是无序的,而 MongoDB 对象是有序的 BSON 对象这一事实有关。

相关的引用是,

Equality matches within subdocuments select documents if the subdocument matches exactly the specified subdocument, including the field order.

我认为,如果将所有三个属性都视为主对象的子属性,而不是子对象的一组属性,我认为你可能会更好。这样子对象的排序就不会被 python 解释器强加到查询中。

比如……

d1 = {'goods.H.p': 0.5, 'goods.H.theta': 100, 'goods.H.sigma': 20}
d2 = {'goods.H.theta': 100, 'goods.H.sigma': 20, 'goods.H.p': 0.5}

collectn.find(d1).count()
collectn.find(d2).count()

...可能会产生更一致的结果。

最后,一种减少代码的方法:

collectn.find({'goods.H.' + k:v for k,v in d1.items()})
collectn.find({'goods.H.' + k:v for k,v in d2.items()})

关于python - Pymongo 或 Mongodb 将两个相等的 python 字典视为不同的对象。我可以强制他们受到同样的对待吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324626/

相关文章:

mysql - 在备份期间保持两个独立数据存储之间的完整性(MySQL 和 MongoDB)

node.js - 在 docker 容器中安装 Mongoose

mongodb - 为什么 MongoDB 可以创建唯一索引而 Mongoid 不能?

javascript - 如何处理 MongoDB 键名中的点?

java - Spring数据mongodb审计不起作用..(Java配置)

mongodb - 为什么 Spring Data MongoDB 无法实例化这种嵌套类型结构?

php - 查询 1000 万个 mongodb 文档

ruby-on-rails - 通过 AWS opsworks 设置 mongodb

php - 如何在 Waterline 或 MongoDB 中选择、分组和加入

mongodb - 复合索引可以服务多个查询吗