如果我们使用shell创建一个collection.it自动创建_id。
我真的不需要_id。我通过pymongo使用manipulate = False来解决这个问题。
当我更新多个文档时,它会抱怨
“”“多次更新要求所有修改过的对象都有_id”“”
这真的很烦人。我应该放弃外壳还是有办法解决这个问题?
不幸的是pymongo似乎还不支持cursor.foreach()。
答案 0 :(得分:1)
我认为这是唯一哈希表示数据库中数据集的一个组成部分。
此外我认为这是不可能的(并且不应该,没有一个非常有效的理由)。
来自here:
在MongoDB中,存储在集合中的文档需要唯一的_id 充当主键的字段。因为ObjectIds很小,大多数 MongoDB可能是唯一的,并且生成速度很快,因此使用ObjectIds作为 如果未指定_id字段,则_id字段的默认值。 MongoDB客户端应添加带有唯一ObjectId的_id字段。 但是,如果客户端未添加_id字段, mongod将添加_id 包含ObjectId的字段。
所以即使你避免shell添加_id,mongod也应该添加它。
答案 1 :(得分:1)
你 必须 一个_id
- 如果你不提供一个mongod会添加一个 - 所以不能避免它。如果您有另一个主键 - 然后将其用作_id
- 它必须是唯一且不可变的。
在pymongo或任何其他驱动程序中,如果你不添加_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')}
答案 2 :(得分:0)
MongoDB 可以被告知不要创建一个_id但这会破坏复制和其他一些依赖于_id
不执行全表扫描等的事情。即使MongoDB也是如此在其他地方允许它(主要是由于错误)剥离_id
字段的选项应该只用于上限集合,以避免在开发时出现严重的性能问题。
我也不建议设置--noobjcheck
,除非你想要放弃一些非常重要的东西来确保文档的一致性。