2011-07-27 14 views
1

私はmongo dbにソーシャルネットワークを構築しています。 以下は、グループコレクション内のドキュメントの構造です。これは、システムに存在する各ソーシャルグループを表します。ユーザーはこのグループの一部であり、jsonオブジェクトの場合は配列である 'members'プロパティによって表されます。mongo db find function in php

{ 
    "group_name":"my group", 
    "members": [ 
    { 
     "user_id": ObjectId("4e29341986ba75dc14000000"), 
     "joined": ISODate("2011-07-26T11:46:49.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2ea94286ba75f81500000e"), 
     "joined": ISODate("2011-07-26T11:47:55.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2eaa0786ba75e815000003"), 
     "joined": ISODate("2011-07-26T11:55:22.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2eab7f86ba75ec1500000a"), 
     "joined": ISODate("2011-07-26T11:57:44.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2eac3586ba75dc15000000"), 
     "joined": ISODate("2011-07-26T12:00:57.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2eacae86ba75dc15000004"), 
     "joined": ISODate("2011-07-26T12:02:43.0Z") 
    }, 
    { 
     "user_id": ObjectId("4e2eadbb86ba75ec1500000c"), 
     "joined": ISODate("2011-07-26T12:07:01.0Z") 
    } 
    ] 

私が直面している問題は、ユーザーが特定のグループに属するかどうかを確認することです。 これは私が思いついたものですが、うまくいかないようです。 助けてください。

$criteria = array(
     '_id' => new MongoId($group_id), 
     'members' => array('user_id' => new MongoId($user_id)) 
    ); 


    return $collection->find($criteria); 

答えて

3

$elemMatch operatorを使用してください。あなたがしたいモンゴシェルで

、:

> criteria = { 
... "_id" : ObjectId("group_id"), 
... "members" : { 
...  $elemMatch : { 
...   "user_id" : ObjectId("user_id") 
...  } 
... } 
...} 
> db.groups.find(criteria); 

それはmembersオブジェクトがObjectId("user_id")user_idを持っているエントリのgroupsコレクションを検索します。

は、PHPでそれをテストしていませんが、構造が同じであるため、これはそれを行う必要があります。

$criteria = array(
    '_id' => new MongoId($group_id), 
    'members' => array(
     '$elemMatch' => array(
      'user_id' => new MongoId($user_id) 
     ) 
    ) 
); 

return $collection->find($criteria); 

ヒント:完全_id句を削除して、あなたはどのグループに見つけることができます(それぞれ別々に照会する代わりに)ユーザーが所属しています。