避免mongodb js shell检查_id

时间:2013-07-12 05:03:23

标签: mongodb

如果我们使用shell创建一个collection.it自动创建_id。

我真的不需要_id。我通过pymongo使用manipulate = False来解决这个问题。

当我更新多个文档时,它会抱怨

“”“多次更新要求所有修改过的对象都有_id”“”

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

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

3 个答案:

答案 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,除非你想要放弃一些非常重要的东西来确保文档的一致性。