【问题标题】:Apache + Python + Mongo: Object Ids aren't equalApache + Python + Mongo:对象 ID 不相等
【发布时间】:2011-10-27 12:27:12
【问题描述】:

我们在 Apache 实例中运行基于 django 的应用程序的两个副本。从数据库加载对象时,我们有这个 python 代码:

id = pymongo.objectid.ObjectId(hex_string)
d = self.collection.find_one({ '_id': id })
assert id == d['_id']

在两个应用程序之一(无论我们点击第二个)上,断言失败。我们查看了 ID,它们是相同的。另外,当我们将其更改为:

assert str(id) == str(d['_id'])

断言通过。在我们的开发机器(Win 7 64 位,django dev server 而不是 Apache)上,这似乎工作正常。

堆栈:Ubuntu 10.04 LTS、Apache 2.2.14、Python 2.6.5、MongoDB 2.0、Pymongo 2.0.1

更新:我们遇到了另一个类似的问题。我们实际上开始将对象称为 BSON 对象 ID,这解决了第二个问题。但是,即使使用 BSON 对象 ID,这个问题中的问题仍然存在。

【问题讨论】:

  • 当您看到这种行为时,apache error_log 文件中是否有任何错误?
  • 我在error_log 中看到的唯一意想不到的事情(除了我们正在修复的DeprecationWarnings,是:TemplateDoesNotExist: 500.html
  • 尝试记录“d['_id']”和“id”的类型。这些是什么?价值观是什么?
  • 如果我能弄清楚如何做到这一点,我会尝试记录它们。我可以告诉你,我们已经在 django 中对失败的实例打开了调试,并查看了我们返回的 500 响应。它们都代表自己,例如,ObjectId('47283de8cf9cc30d000000') Plus,完全相同的代码适用于其他应用程序。我将编辑问题以澄清该混淆因素。

标签: django apache mongodb pymongo


【解决方案1】:

有点像在黑暗中开枪,但您绝对不会使用分片,是吗?我还没有测试过,但如果你在非 _id 字段上分片,似乎有可能有两个具有相同 _id 的文档。您是自己生成 _id 值还是让 pymongo 在插入时为您生成?

【讨论】:

  • 不,没有分片。我们让 pymongo 为我们创建 id。
猜你喜欢
  • 2018-12-06
  • 2020-06-22
  • 2015-11-16
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多