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', я хочу заменить его именем пользователя отправителя.

Мое главное сомнение в том, что ручные ссылки - правильный подход для этого сценария, потому что с этой техникой (если я не пропустил все понял), печать списка сообщений будет включать:

  1. "запрос" для печати списка сообщений
  2. другой "запрос" для получения имени пользователя из другой коллекции для каждого сообщения. Также, если пользователь получил 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 раз, вам нужно запрашивать только тогда, когда требуется дополнительная информация о пользователе - например, получение его профиля и т. Д.

Другие вопросы по тегам