使用PHP驱动程序在文档中查找嵌套值

时间:2012-08-30 04:00:46

标签: php mongodb nested

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

$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(或关于用户的任何内容)来找到朋友。我对如何做到这一点感到困惑,基本上我的脑海中的过程是:

  • 传递朋友的身份
  • 查询用户的集合
  • 查找所有“user_friends”字段
  • 从中,找到与我原来传入的ID相匹配的键
  • 最终使用正确的朋友对象

我尝试的东西都没有。也许我错误地构建了数据。如果有人能把我放在正确的道路上,我真的很感激。

干杯!

1 个答案:

答案 0 :(得分: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是否重复但仍值得一试。

Pre 2.2这有点困难,正如你所说,你必须把朋友身份存在的所有朋友都赶走:

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的情况下更新朋友。

希望它有所帮助,