MongoDB - PHP手册参考方法适用性

时间:2013-09-26 18:03:11

标签: php mongodb mongodb-php dbref reference-manual

MongoDB新手在这里。我对引用有第一种方法,我的主要疑问是我是否使用适当的策略(手动引用)来处理我的情况。

在同一个数据库中处理2个集合(用户,消息),让我们举例说明存储在用户集合中的文档:

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),
)

以及存储在邮件集合中的文档示例(从其他用户发送到“pluto”上方的用户):

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. 打印消息列表的'query'
  2. 另一个'查询',用于从每个邮件的其他集合中检索用户名。此外,如果用户收到了1000条消息,这种方法必须运行1001查询??
  3. 我的第二个疑问是,是否有办法直接合并或替换两个游标的结果

1 个答案:

答案 0 :(得分:0)

根据您的用例,可能可以复制一些数据,并将有关发送用户的一些必要字段存储为嵌入式文档 - 在本例中为用户名。

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)查询消息时,您将获得具有正确ID的所有消息from_user,但也已经有他们的用户名显示。

现在,您只需要查询有关用户的更多信息(例如获取其个人资料等),而不是查询1000次以上...