好的,这是我的问题。我的数据库中的每个用户都有一个名为“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(或关于用户的任何内容)来找到朋友。我对如何做到这一点感到困惑,基本上我的脑海中的过程是:
我尝试的东西都没有。也许我错误地构建了数据。如果有人能把我放在正确的道路上,我真的很感激。
干杯!
答案 0 :(得分:0)
基本上我认为你想要做的是创建一个编辑表单,例如,一个将跨越多个用户的朋友。所以让我们打破这个:
可以帮助你的一件事是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的情况下更新朋友。
希望它有所帮助,