1

好的,这是我的问题。我数据库中的每个用户都有名为“朋友”的字段。每次添加朋友时,它都会获得一个唯一的 id,并根据该 id 的字符串类型版本在朋友字段中键入,如下所示:

$user          =   AppDatabase::getInstance()->getUser($user_id);
$user_friends  =   $user['friends'];
$new_friend    =   array
                                    (
                                        'friend_id'=>new MongoId($friend_id),
                                        'nickname'=>(string)$nickname,
                                        'friendpic'=>''
                                    );

$user_friends[(string)$friend_id] = $new_friend;

这一切都很好,工作正常,我在 db 中得到如下所示的结果:

'friends':
{
503da7ba65d351681a00000c
{
'friend_id':{$oid:503da7ba65d351681a00000c},
'nickname':"Heisenberg",
'friendpic':''
}
}

现在,我需要做的是只使用他们的friend_id而不知道user_id(或有关用户的任何信息)来找到朋友。我对如何做到这一点有点困惑,基本上我脑海中的过程是:

  • 传入好友的id
  • 查询用户的收藏
  • 查找所有“user_friends”字段
  • 从中找到与我最初传入的id匹配的key
  • 以正确的朋友对象结束

我正在尝试的所有方法都没有真正起作用。也许我的数据结构不正确。如果有人能让我走上正确的道路,我将不胜感激。

干杯!

4

1 回答 1

0

基本上我认为你想做的是为一个跨越多个用户的朋友创建一个编辑表单。所以让我们分解一下:

  • 你有好友ID
  • 所有用户中的所有朋友都具有相同的数据(或者可能没有,并且朋友 ID 是唯一的,这应该可以工作)
  • 您需要在不知道根文档的 id 的情况下更新该朋友 id

在这里可以为您提供帮助的一件事是 Mongo 的 v2.2,它实际上可以使用主文档中的位置运算符来选择它,从而为您提供与以下类似的结果:

'friends':
{
503da7ba65d351681a00000c: {
    'friend_id':{$oid:503da7ba65d351681a00000c},
    'nickname':"Heisenberg",
    'friendpic':'' }
}

无论您在该列表中有多少朋友。我个人还没有使用过这种查询方法,但是这里是它的 JIRA:https ://jira.mongodb.org/browse/SERVER-828所以你可以玩这样的查询:

find({'friends.503da7ba65d351681a00000c': {$exists: true}}, {'friends.$':1})

可能会奏效,我听说有时您需要使用$elematch. 我不确定这是否完全有效,因为我不确定friend_id是否重复但仍然值得一试。

在 2.2 之前,这有点困难,正如您所说,您必须找出所有存在该朋友 ID 的朋友:

find({'friends.503da7ba65d351681a00000c': {$exists: true}});

然后通过它来挑选它们(伪代码):

foreach(result as id => friend){
    if(id == id_i_am_looking_for) return friend;
}

然后您可以使用该文档并对其进行更新。要将其放回数据库中(假设您手头有完整的对象),您可以执行以下操作:

db.update({'friends.503da7ba65d351681a00000c': {$exists: true}}, 
    {$set: {'friends.$' : new_friend_object}});

如果您没有要玩的整个朋友对象,那么您将需要以相对相同的方式更新每个字段。

之后,您现在应该能够在不知道 user_id 的情况下更新朋友。

希望能帮助到你,

于 2012-08-31T07:21:57.480 回答