Auto Increment with MongoDB
Популярная по своей дурости задача «а я не хочу эти длинные id, я хочу увеличивающиеся циферки в качестве айдишников».
Несмотря на свою нелепость, она иногда нужна. Например, человекочитаемые номера. «Хуйня номер 10».
Самый простой и рекомендуемый всеми способ — хранить где-то отдельно счетчик и менять его с помощью findandmodify (для чего в php нет отдельного метода, но можно через command).
Но можно сделать проще!
Если это хорошая, правильная таблица, из которой ничего не удаляется, то мы можем посчитать «номер записи» в таблице тупо зная тот факт, что нативные MongoId увеличиваются со временем и по ним можно сортировать не хуже, чем по какой-нибудь «дате создания».
Короче, как-то так:
$mongo -> insert ($U);
$inc = $mongo -> find (array ("_id" => array ('$lt' => $U[_id])));
$inc = $inc -> count ();
$inc++;
$mongo -> update (array ("_id" => new MongoId ($U[_id])), array ('$set' => array ("inc" => $inc)));
Ограничения очевидны, но часто «и так сойдет», да-да.
Файлы в базе
Люди, которые хранят файлы в базе — больные извращенцы.
Если это MySql, хехе.
В Монго есть специальный механизм для хранения файлов в «базе», называется GridFS.
Полезностей у него минимум две:
1. Легкий бэкап кучи файлов с помощью репликации базы.
2. Все равно нужна таблица с метаинформацией к файлам, тут все хранится «вместе».
Цитата раз:
A: The nice thing about GridFS is that it streams the data back to the client, so you never need more than 4MB of memory.
Q: Now I know.
Цитата два:
There is currently no method that automatically streams chunks, but it would be fairly easy to write by querying the $grid->chunks collection.
Кто-то из них явно пиздит. Скорее всего, везде, кроме Советской России, файл и правда отдается чанками, но конкретно в PHP такого способа нет (MongoGridFSFile::getBytes() грузит файл целиком в память).
Пришлось делать как-то так, короче:
foreach($cursor as $chunk) echo $chunk['data']->bin;$cursor = $M[chunks]->find(array("files_id" => $img->file['_id']))->sort(array("n" => 1));
В общем, я на очередном дейтинге проекте пока сделал «все картинки в базе», а там поглядим.
R3
Full Text Search in Mongo
Прочитал про Full Text Search в Mongo.
Это великолепно.
Нет, правда.