2011-07-27 55 views
1

我正在用mongo db建立一个社交网络。 以下是组合集合中文档的结构。它代表了系统中存在的每个社交群体。用户是这个组的一部分,它由'members'属性表示,如果是json对象,那么它是一个数组。mongo db在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); 

它将搜索groups集合了其中members对象有ObjectId("user_id")一个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条款,你可以找出哪个组用户属于(而不是分别查询每一个)。