2011-07-27 53 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條款,你可以找出哪個組用戶屬於(而不是分別查詢每一個)。