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 == d2是True).我正在尝试执行以下操作:在将记录插入数据库之前,我检查是否已存在具有正在添加的确切值组合的记录.如果是这样,那么我不想创造新纪录.但是由于上面显示的行为,有可能得到记录不存在,即使它确实存在并且重复记录被添加到数据库中(当然,使用不同的_id但所有其他值都是相同的,我宁愿没有那个).
预先感谢您的帮助.
您遇到的问题是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)
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |