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;

これはすべて問題なく、正常に動作します。次のような結果がデータベースに表示されます。

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

今、私ができるようにする必要があるのは、friend_id のみを使用し、user_id (またはユーザーに関するもの) を知らずに友人を見つけることです。これを行う方法について少し混乱しています。基本的に頭の中のプロセスは次のとおりです。

  • 友達のIDを渡す
  • ユーザーのコレクションを照会する
  • すべての「user_friends」フィールドを検索
  • これから、最初に渡したIDに一致するキーを見つけます
  • 正しい友達オブジェクトで終わる

私が試していることはどれも実際には機能しません。おそらく、データの構造が間違っているのでしょう。誰かが私を正しい道に導くことができれば、本当に感謝しています。

乾杯!

4

1 に答える 1

0

基本的に、あなたがやりたいことは、たとえば、複数のユーザーにまたがる友人用の編集フォームを作成することだと思います。それでは、これを分解しましょう:

  • フレンドIDをお持ちの方
  • すべてのユーザー内のすべての友達が同じデータを持っています (またはそうでない可能性があり、友達 ID は一意であり、どちらの方法でも機能するはずです)。
  • ルート ドキュメントの ID を知らずにそのフレンド ID を更新する必要があります

ここで役立つことの 1 つは、Mongo の v2.2 です。メイン ドキュメントの位置演算子を使用して実際にこれを選択すると、次のような結果が得られます。

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

そのリストにいる友達の数に関係なく。私は個人的にまだこのクエリ方法を使用していませんが、ここに JIRA があります。

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に戻すには(完全なオブジェクトが手元にある場合)、次のことができます:

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

プレイするフレンド オブジェクト全体がない場合は、どちらの方法でもフィールドごとに更新する必要があります。比較的同じです。

その後、user_id を知らなくてもフレンドを更新できるようになります。

それが役に立てば幸い、

于 2012-08-31T07:21:57.480 に答える