0

如果我们使用 shell 创建一个集合,它会自动创建 _id。

而且我真的不需要_id。我通过pymongo使用操纵=假来解决这个问题。

当我更新多文档时它抱怨

"""多重更新要求所有修改的对象都有一个_id"""

这真的很烦人。我应该放弃外壳还是有办法解决这个问题?

不幸的是 pymongo 似乎还不支持 cursor.foreach() 。

4

3 回答 3

1

我认为这是唯一哈希如何表示数据库中的数据集的一个组成部分。

此外,我认为这是不可能的(而且不应该,没有非常正当的理由)。

这里

在 MongoDB 中,存储在集合中的文档需要一个唯一的 _id 字段作为主键。因为 ObjectIds 很小,很可能是唯一的,并且生成速度很快,如果未指定 _id 字段,MongoDB 使用 ObjectIds 作为 _id 字段的默认值。 MongoDB 客户端应添加具有唯一 ObjectId的 _id 字段。但是,如果客户端没有添加 _id 字段,mongod 将添加一个 包含 ObjectId 的 _id 字段。

因此,即使您避免 shell 添加 _id,mongod 也应该添加它。

于 2013-07-12T05:20:09.790 回答
1

必须有一个_id- 如果你不提供一个 mongod 会添加一个 - 所以没有避免它。如果您有另一个主键 - 然后将其用作主键 -_id它必须是唯一且不可变的。

在 pymongo 或任何其他驱动程序中,如果您不添加 a_id它通常会为您添加一个 - 在 pymongo 中manipulate=False意味着 pymongo 不会添加_id但 mongod 仍然会:

>>> import pymongo
>>> conn = pymongo.MongoClient()
>>> db = conn["test"]
>>> db.drop_collection("test")
>>> db.test.insert({"a": 123}, manipulate=False)
[None]
>>> db.test.find_one()
{u'a': 123, u'_id': ObjectId('51dfbfe13eb39b26159bd56b')}
于 2013-07-12T08:37:35.470 回答
0

可以告诉MongoDB不要创建 _id 但这会破坏复制和许多其他依赖于_id不进行全表扫描等的事情。即使 MongoDB 在其他地方确实允许它(主要是由于错误),也可以选择strip 该_id字段只能用于有上限的集合,以避免在扩展时出现严重的性能问题。

我也不建议设置--noobjcheck,除非你想放松一些非常重要的东西来确保你的文档的一致性。

于 2013-07-12T07:49:56.460 回答