0

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. 用于打印消息列表的“查询”
  2. 另一个“查询”,用于从其他集合中检索每条消息的用户名。此外,如果用户收到 1000 条消息,这种方法将不得不运行 1001 查询?

我的第二个疑问是是否有办法直接合并或替换两个游标的结果

4

1 回答 1

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 多次,而只需要在需要有关用户的更多信息时进行查询 - 例如获取他们的个人资料等......

于 2013-09-26T18:43:47.953 回答