Преобразование таблицы MySQL с идентификаторами в таблицу MongoDB с помощью _id - PullRequest
1 голос
/ 12 апреля 2011

Я переношу таблицу MySQL в MongoDB. В моей таблице MySQL есть первичный ключ id, и я хочу, чтобы этот id был преобразован в _id в MongoDB.

Я использую php's MongoCollection::insert( $mysql_array );

Однако это не сработает, потому что если я установлю $mysql_array['_id'], он будет восприниматься монго как String вместо MongoId. Я попытался $mysql_array['_id'] = new MongoId( $id ), но он не позволяет мне переопределить значение по умолчанию _id. Я видел, что все целочисленные столбцы в MySQL конвертируются в строку MongoCollection::insert(). Если бы я мог установить MongoCollection::insert() для правильной передачи целого числа, возможно, это сработало бы.

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011

введите _id к целочисленному значению, как это ...

(int) $ mysql_array ['_ id']

Вы обнаружите, что делаете это много в mongoDB

1 голос
/ 12 апреля 2011

Вы не сможете преобразовать произвольное значение String в Mongo ObjectId из-за его специфических характеристик (12 байтов -> 24 символа, сгенерированных из 4-байтовой метки времени, 3-байтового имени хоста клиента, 2-байтового PID, 3-байтового значения inc).

Либо вы отказываетесь от использования типа MongoId в полях _id вашей коллекции и используете вместо этого свой MySQL-ID в качестве строки (что не является проблемой и имеет смысл), либо вы позволяете Mongo генерировать_id для вас, что также является подходящим решением, если вы хотите использовать функции MongoId (при условии, что вы работаете с PHP): Класс MongoId

ВыборВторое решение: вы по-прежнему можете хранить свои MySQL-идентификаторы в другом поле документа, например id или * mysql_id *, чтобы ссылаться на них позже.

Относительно вашего вопроса о (int) и(строковые) значения: Вы уверены, что они приходят как целое число PHP из вашей базы данных MySQL?Если это так, они обычно должны храниться как целые числа в Mongo.Проверьте это с помощью var_dump () и в случае несовместимости приведите его с (int).Может быть, было бы полезно, если бы вы опубликовали свой код выбора / вставки ...

1 голос
/ 12 апреля 2011

ObjectId - это специальный тип в Mongo, но свойство _id не обязательно должно быть этого типа.Вы не можете ввести строку или число в ObjectId, и вы не должны.

Я предполагаю, что проблема, как вы понимаете, заключается в том, что ваш insert сработал, но когда вы просматривали данные в базе данных, свойство _id не было похоже на _id: ObjectId("1234") (если исходный идентификаторбыло 1234).Так и должно быть, и это прекрасно.

Идея ObjectId состоит в том, что она имеет предопределенную структуру, которая гарантирует (в основном) уникальность в кластере Монго, но это также означает, что она должна иметь эту структуру, в противном случае это не так.ObjectId.

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

0 голосов
/ 12 апреля 2011

Используйте MongoCollection::save(), и ваш массив должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...