2011-07-27 2 views
1

Je construis un réseau social à mongo db. Voici la structure du document dans la collection de groupes. Il représente chaque groupe social présent dans le système. Les utilisateurs font partie de ce groupe qui est représenté par la propriété 'members' qui est un tableau si les objets json.mongo db trouver une fonction dans 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") 
    } 
    ] 

Le problème auquel je suis confronté est de savoir comment vérifier si un utilisateur appartient à un certain groupe. C'est ce que j'ai trouvé mais ça ne semble pas fonctionner. S'il vous plaît aider.

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


    return $collection->find($criteria); 

Répondre

3

Utilisez le $elemMatch operator.

En shell mongo, vous feriez:

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

Il cherchera la collection groups une entrée pour laquelle un objet members a une user_id de ObjectId("user_id").

ai pas testé en PHP, mais étant donné que la structure est la même, cela devrait le faire:

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

return $collection->find($criteria); 

Astuce: Retirez complètement la clause _id et vous pouvez savoir à quels groupes les l'utilisateur appartient (au lieu d'interroger chacun séparément).