Pymongo或Mongodb将两个相同的python词典视为不同的对象.我可以强迫他们一起对待吗?

Cur*_*arn 11 python mongodb pymongo

请查看以下代码行和结果:

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
Run Code Online (Sandbox Code Playgroud)

其中,collectn是Mongodb集合对象.

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

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

预先感谢您的帮助.

may*_*ewr 6

您遇到的问题是MongoDB的文档中说明这里.它还与Python字典是无序的并且MongoDB对象是有序的BSON对象这一事实有关.

相关报价是,

如果子文档完全匹配指定的子文档(包括字段顺序),则子文档内的等式匹配选择文档.

我认为,如果你把所有的三个属性为主要对象,而不是该特性的一个集合的子属性,你可能会更好子对象.这样,子对象的排序不会被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()
Run Code Online (Sandbox Code Playgroud)

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

最后,一种方法来改变更少的代码:

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