如果我们使用 shell 创建一个集合,它会自动创建 _id。
而且我真的不需要_id。我通过pymongo使用操纵=假来解决这个问题。
当我更新多文档时它抱怨
"""多重更新要求所有修改的对象都有一个_id"""
这真的很烦人。我应该放弃外壳还是有办法解决这个问题?
不幸的是 pymongo 似乎还不支持 cursor.foreach() 。
如果我们使用 shell 创建一个集合,它会自动创建 _id。
而且我真的不需要_id。我通过pymongo使用操纵=假来解决这个问题。
当我更新多文档时它抱怨
"""多重更新要求所有修改的对象都有一个_id"""
这真的很烦人。我应该放弃外壳还是有办法解决这个问题?
不幸的是 pymongo 似乎还不支持 cursor.foreach() 。
我认为这是唯一哈希如何表示数据库中的数据集的一个组成部分。
此外,我认为这是不可能的(而且不应该,没有非常正当的理由)。
从这里:
在 MongoDB 中,存储在集合中的文档需要一个唯一的 _id 字段作为主键。因为 ObjectIds 很小,很可能是唯一的,并且生成速度很快,如果未指定 _id 字段,MongoDB 使用 ObjectIds 作为 _id 字段的默认值。 MongoDB 客户端应添加具有唯一 ObjectId的 _id 字段。但是,如果客户端没有添加 _id 字段,mongod 将添加一个 包含 ObjectId 的 _id 字段。
因此,即使您避免 shell 添加 _id,mongod 也应该添加它。
你必须有一个_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')}
可以告诉MongoDB不要创建 _id 但这会破坏复制和许多其他依赖于_id
不进行全表扫描等的事情。即使 MongoDB 在其他地方确实允许它(主要是由于错误),也可以选择strip 该_id
字段只能用于有上限的集合,以避免在扩展时出现严重的性能问题。
我也不建议设置--noobjcheck
,除非你想放松一些非常重要的东西来确保你的文档的一致性。