По умолчанию размер строки будет больше, как описано 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 }
Я нахожусь думая о том, чтобы представить ошибку.
Ситуация еще стоит с NumberLong() тип, который является 64-битный целочисленный тип BSON:
> 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, но будьте осторожны.
Строка будет использовать больше места в индексе, также я могу себе представить, что это будет меньше peformant, на самом деле не так много преимуществ, кроме как вы можете запросить без обертывания всего в 'ObjectId' – Sammaye
Ok. Возможно ли предотвратить листинг ObjectId в каждом запросе? – Erik
Хм, возможно, вы могли бы создать расширенный класс 'model', который в своих функциях поиска обнаруживает, если вы ищете' _id', и если вы отбрасываете его в ObjectId – Sammaye