Подтвердить что ты не робот

Неправильно ли изменить тип _id в MongoDB на целое?

MongoDB использует ObjectId для _id.

Будет ли плохо, если я сделаю _id инкрементирующее целое?

(этот камень, если вам интересно)

4b9b3361

Ответ 1

Нет, это совсем не плохо, и на самом деле встроенный ObjectId достаточно ObjectId в пределах индекса, поэтому, если вы считаете, что у вас есть что-то лучше, вы можете изменить значение поля _id по умолчанию на что угодно.

Но, и это большое, но есть некоторые соображения при решении отойти от сформулированного по умолчанию ObjectId, особенно при использовании автоматически увеличивающихся _ids, как показано здесь: http://docs.mongodb.org/manual/tutorial/create -an-Автоинкрементное поле /# автоинкрементируемых счетчики сбор

Многопоточность не такая большая проблема, потому что findAndModify и атомарные блокировки могут позаботиться об этом, но тогда вы просто findAndModify со своей первой проблемой. findAndModify - не самая быстрая и не самая легкая функция, и при ее регулярном использовании отмечаются значительные падения производительности.

В любом случае, вы также должны учесть затраты на выполнение этого самостоятельно, даже без findAndModify. Для каждой вставки у вас есть необходимость сделать дополнительный запрос. Изображение, имеющее уникальный идентификатор, который вы должны запрашивать уникальность каждый раз, когда вы хотите вставить, в конце концов, ваша скорость вставки упадет до уровня сканирования, и ваша блокировка будет накапливаться.

Конечно, ObjectId действительно хорош, будучи уникальным, без необходимости проверять или формулировать свою уникальность, касаясь базы данных перед вставкой, следовательно, он не имеет таких накладных расходов.

Это говорит о том, что это не самая плохая идея в мире, и если вы думаете, что она подходит вашему сценарию, сделайте это, но помните, что если вам не требуется автоматическое увеличение идентификатора, это может быть бременем для вас.

Ответ 2

Вы можете это сделать, но вы несете ответственность за то, чтобы целые числа были уникальными.

MongoDB не поддерживает поля автоматического инкремента, такие как большинство баз данных SQL. Когда у вас есть распределенное или многопоточное приложение, которое имеет несколько процессов и/или потоков, которые создают новые записи в базе данных, вы должны убедиться, что они используют один и тот же счетчик. В противном случае может случиться так, что два потока попытаются сохранить документ с тем же _id в базе данных.

Когда это произойдет, один из них потерпит неудачу. Это означает, что вам нужно дождаться, когда база данных вернет успех или ошибку (вызвав GetLastError или установив проблемы с записью на подтверждение), что занимает больше времени, чем просто отправка данных в режиме "огонь и забухание".