默认情况下,字符串的大小将更大,如 Sammaye 在评论中描述的那样。形式化它:
Object.bsonsize({ "_id" : ObjectId("51b10b55f202d3fee925d637")}) = 22
Object.bsonsize({ "_id" : "51b10b55f202d3fee925d637"}) = 39
Object.bsonsize({ "_id" : "aaaaaaa"}) = 22
Object.bsonsize({ "_id" : 9999999999999998 }) = 18
因此,一个 7 字符长的字符串与 ObjectId 的大小相同。如果您使用的数字较小,但您必须考虑这一点:
我发现真正有趣的是,在 mongoshell 中键入是自动的,数字类型之间的转换是自动的。所以基本上你可以存储为“整数”(至少是格式)的最大数字是 9999999999999998,这有点奇怪,但它不应该与十进制表示相关(实际上 BSON 数据类型是 Double)。上面的所有数字都会自动转换并四舍五入为正常形式,例如:
{_id:9999999999999999}
将存储为:1e+16.0,它是一个四舍五入的值,因此当您尝试插入时:
insert({_id:10000000000000001})
E11000 duplicate key error index: $_id_ dup key: { : 1e+16.0 }
我正在考虑提交一个错误。
64 位整数 BSON 类型的 NumberLong() 类型甚至值得这种情况:
> db.m.insert({_id: NumberLong(10000000000000001)})
E11000 duplicate key error index: t.m.$_id_ dup key: { : 10000000000000000 }
> db.m.insert({_id: NumberLong(10000000000000002)})
> db.m.insert({_id: NumberLong(10000000000000003)})
> db.m.insert({_id: NumberLong(10000000000000004)})
E11000 duplicate key error index: t.m.$_id_ dup key: { : 10000000000000004 }
> db.m.insert({_id: NumberLong(10000000000000005)})
E11000 duplicate key error index: t.m.$_id_ dup key: { : 10000000000000004 }
> db.m.insert({_id: NumberLong(10000000000000006)})
> db.m.insert({_id: NumberLong(10000000000000007)})
> db.m.insert({_id: NumberLong(10000000000000008)})
E11000 duplicate key error index: t.m.$_id_ dup key: { : 10000000000000008 }
> db.m.insert({_id: NumberLong(10000000000000009)})
E11000 duplicate key error index: t.m.$_id_ dup key: { : 10000000000000008 }
因此,您可以使用存储大小小于 ObjectId 的数字,但要小心。