我有一个具有guid的类/对象,我希望在保存到Mongodb时将该字段用作_id对象。是否可以使用其他值而不是ObjectId?
当存在_id字段时,在进行批量插入时是否有任何性能考虑因素? _id是一个索引吗?如果我将_id设置为不同的字段,它会减慢批量插入吗?我插入了大约1000万条记录。
答案 0 :(得分:1)
1)是的,你可以使用该字段作为id。没有提到您用于插入文档的API(如果有)。因此,如果您要在命令行执行插入,则命令为:
db.collection.insert({_id : <BSONString_version_of_your_guid_value>, field1 : value1, ...});
它不一定是BsonString。将其更改为与您的guid原始类型最接近的Bson值(数组类型除外。不允许使用数组作为_id字段的值)。
2)据我所知,db.collection.insert
当你提供自己的ID时会有 IS 对性能的影响,尤其是批量生成,但如果id已经排序等,那么不应该是性能损失。原因,我引用:
索引的结构是B树。 ObjectIds非常出色 关于索引树的插入顺序:它们总是如此 增加,意味着它们总是插在右边缘 B树。反过来,这意味着MongoDB只需要保持正确 记忆中B树的边缘。
相反,_id字段中的随机值表示_ids将是 插在树上。然后机器必须移动一页 索引到内存,更新它的一小部分,然后可能忽略它 直到它再次滑出内存。这效率较低。
:from the book `50 Tips and Tricks for MongoDB Developers`
小贴士的标题是 - “当您拥有自己简单,唯一的ID 时覆盖_id。”显然,如果你有一个和你不需要ObjectId的属性,那么最好使用你的id。如果您的ID因上述原因而增加,则最好。
3)MongoDB在_id字段上有一个默认索引。
答案 1 :(得分:0)
因此...
ObjectId
之外的其他类型,包括GUID
将保存为BinData
。_id
总是在增加(比如越来越多的数字,或ObjectId
),那就更好了,否则索引需要更频繁地重建自己。如果您打算使用分片,_id
也应该均匀散列。_id
确实自动拥有索引。 结论:最好继续使用ObjectId
,除非你有充分理由不这样做。