Монго дБ найти функцию в PHP - PullRequest
1 голос
/ 27 июля 2011

Я строю социальную сеть в Монго ДБ.Ниже приводится структура документа в коллекции групп.Он представляет каждую социальную группу, присутствующую в системе.Пользователи являются частью этой группы, которая представлена ​​свойством members, являющимся массивом объектов json.

{
  "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);

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

попробуйте следующий код:

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


return $collection->find($criteria);

см. http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

3 голосов
/ 27 июля 2011

Используйте оператор $ elemMatch .

В оболочке Монго вы должны сделать:

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

Он будет искать в коллекции groups запись, для которой у объекта members есть user_id из ObjectId("user_id").

Не тестировал его в PHP, но поскольку структура та же самая, он должен это сделать:

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

return $collection->find($criteria);

Подсказка: Полностью удалите предложение _id, и вы сможете узнать, к каким группам принадлежит пользователь (вместо того, чтобы запрашивать каждую из них в отдельности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...