PHP и ссылки несколько неинтуитивны. Если использовать соответствующие ссылки в правильных местах, это может обеспечить большие улучшения производительности или избежать очень уродливых обходных решений и необычного кода.
Следующее приведет к ошибке:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Ни у кого из них нет чтобы они могли следовать приведенным ниже правилам, но, без сомнения, были удалены или отключены, чтобы предотвратить много путаницы.
Если они действительно работали, оба включают избыточное преобразование в ссылку, а второе также включает в себя избыточное преобразование обратно в облачную содержащуюся переменную.
Второй вариант был возможен, позволяя передавать ссылку на код, который не предназначен для работы со ссылками. Это крайне уродливо для ремонтопригодности.
Это ничего не сделает:
function f($v){$v = true;}
$r = &$v;
f($r);
В частности, он возвращает ссылку обратно в обычную переменную, поскольку вы не запрашивали ссылку.
Это будет работать:
function f(&$v){$v = true;}
f($v);
Это означает, что вы передаете ссылку без ссылки, но хотите получить ссылку, поэтому она превращается в ссылку.
Что это означает, что вы не можете передать ссылку на функцию, в которой ссылка явно не указана для того, чтобы сделать ее одной из немногих областей, где PHP является строгим при передаче типов или в этом случае больше мета-типа.
Если вам нужно больше динамического поведения, это будет работать:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Здесь он видит, что вы хотите ссылку и уже имеете ссылку, поэтому оставите ее в покое. Он может также связывать ссылку, но я в этом сомневаюсь.
Если у вас есть , существующий ID ( говорит из существующего набора данных ), то вполне нормально переопределять _id
с тем, который у вас есть.
... keeo _id нетронутый, поскольку он помогает индексировать и т. д.
blockquote>MongoDB по умолчанию индексирует поле
_id
. Если вы начнете вкладывать целые числа в поле_id
, они будут индексироваться, как и все остальное.Таким образом, большинство RDBM предоставляют идентификатор «auto-increment». Это хорошо для небольших наборов данных, но действительно плохо с точки зрения масштабируемости. Если вы пытаетесь вставить данные на 20 серверов одновременно, как вы сохраняете «автоматическое увеличение»?
Обычный ответ заключается в том, что вы этого не делаете. Вместо этого вы в конечном итоге используете такие же идентификаторы GUID для этих идентификаторов. В случае MongoDB
ObjectId
уже предоставлен.Мне было интересно узнать о какой-либо лучшей стратегии, чтобы можно было использовать объект mongoIt как более удобный для пользователя и легко запоминающийся ключ
blockquote>Таким образом, проблема в том, что идентификатор «легко запоминается» на самом деле не связан с «высоко масштабируемой базой данных». Когда у вас есть миллиард документов, идентификаторы на самом деле не «легко запоминаются».
Итак, вам нужно сделать компромисс здесь. Если у вас есть таблица, которая может стать действительно большой, я предлагаю использовать ObjectId. Если у вас есть относительно небольшая таблица и она часто не обновляется (например, таблица поиска), вы можете создать собственный автоинкремент.
Выбор действительно зависит от вас.
Вы можете перезаписать _id самостоятельно . Нет никаких обязательств по использованию идентификатора объекта с автогенератором. В чем проблема с переопределением _id внутри вашего приложения в соответствии с вашими потребностями?