MongoDB - пригодность ссылок на PHP вручную
MongoDB новичок здесь. У меня первый подход к ссылкам, и мое главное сомнение в том, использую ли я подходящую стратегию (ручные ссылки) для моей ситуации.
Работая с двумя коллекциями (пользователь, сообщение) в одной базе данных, давайте создадим пример документа, хранящегося в пользовательской коллекции:
array (
'_id' => new MongoId("5231817277758e660c7202c4"),
'uname' => 'pluto',
'pwd' => new MongoInt32(1234567),
'email' => 'pluto1@gmail.com',
'phone_home' => new MongoInt64(23409238),
'phone_work' => new MongoInt64(54389724),
'phone_mobile' => new MongoInt64(9823422),
'visible' => new MongoInt32(1),
)
и пример документа, хранящегося в коллекции сообщений (отправленный ОТ другого пользователя ТО пользователю, находящемуся выше "Плутона"):
array (
'_id' => new MongoId("524358102660b2c70b8b4567"),
'from_uid' => '5231817277758e660c7202d7',
'to_uid' => '5231817277758e660c7202c4',
'object' => 'mongo manual Ref',
'content' => 'is that the correct approach?',
'datetime' => '2013-09-25 23:39:28',
)
Пользователь, вошедший в систему ('pluto'), может видеть все сообщения, которые он получил от других пользователей, но я не смотрю, чтобы напечатать значение 'from_uid', я хочу заменить его именем пользователя отправителя.
Мое главное сомнение в том, что ручные ссылки - правильный подход для этого сценария, потому что с этой техникой (если я не пропустил все понял), печать списка сообщений будет включать:
- "запрос" для печати списка сообщений
- другой "запрос" для получения имени пользователя из другой коллекции для каждого сообщения. Также, если пользователь получил 1000 сообщений, этот подход должен будет выполнить 1001 запрос??
Мое вторичное сомнение заключается в том, существует ли способ прямого слияния или замены результата двух курсоров.
1 ответ
Учитывая ваш вариант использования, вероятно, было бы неплохо продублировать немного данных и сохранить некоторые необходимые поля об отправляющем пользователе в виде внедренного документа - в данном случае, имени пользователя.
array (
'_id' => new MongoId("524358102660b2c70b8b4567"),
'from_user' => array(
'uid' => '5231817277758e660c7202d7',
'uname' => 'mars'
),
'to_uid' => '5231817277758e660c7202c4',
'object' => 'mongo manual Ref',
'content' => 'is that the correct approach?',
'datetime' => '2013-09-25 23:39:28',
)
Этот подход означает, что когда вы запрашиваете сообщения для пользователя (в котором вы уже знаете to_uid
), вы получаете все сообщения с правильным идентификатором на from_user
, но также уже есть их имя пользователя для отображения.
Теперь, вместо того, чтобы делать запросы более 1000 раз, вам нужно запрашивать только тогда, когда требуется дополнительная информация о пользователе - например, получение его профиля и т. Д.