2012-03-15 71 views
1

我正在開發一個使用Codeigniter和MongoDB的Web應用程序。 在數據庫中我得到了一個文件,如下所示:在MongoDB文檔中查找匹配的數組項目

{ 
    "_id": { 
     "$id": "4f609932615a935c18r000000" 
    }, 
    "basic": { 
     "name": "The project" 
    }, 
    "members": [ 
     { 
      "user_name": "john", 
      "role": "user", 
      "created_at": { 
       "sec": 1331730738, 
       "usec": 810000 
      } 
     }, 
     { 
      "user_name": "markus", 
      "role": "user", 
      "created_at": { 
       "sec": 1331730738, 
       "usec": 810000 
      } 
     } 
    ] 
} 

我需要同時使用user_name和作用,該文件搜索。現在,當我使用下面的代碼時,我得到了兩個。我只想獲得匹配user_name和role的數組項目。

$where = array (

    '_id' => new MongoId ($account_id), 

    'members.user_id' => new MongoId ($user_id), 

    'members.role' => $role 

); 

$this -> cimongo -> where ($where) -> count_all_results ('accounts'); 

回答

2

這是這個問題的重複:

Get particular element from mongoDB array

你也可能要使用$ elemMatch

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

這裏是擦 - 你不是活得t將能夠獲得匹配的數組項,因爲如果這些元素匹配,mongo將返回整個文檔。你將不得不解析代碼客戶端。 Mongo沒有辦法回答,「只返回匹配的數組。」

+2

好,爲2.2,你可以使用相同的$ elemMatch標準作爲投影過,那麼你會在你的結果得到的只是匹配的元素。不過要注意的是:當在投影中使用時,elemMatch將僅返回FIRST匹配元素。沒有辦法不幸的返回多個比賽。請參閱:http://docs.mongodb.org/manual/reference/projection/elemMatch/ – UpTheCreek 2013-02-26 12:28:25

4

這是一個老問題,但從MongoDB 2.2左右開始,您可以在投影中使用$ positional operator,以便只有匹配的數組元素包含在結果中。

所以,你可以做這樣的事情:

$this->cimongo->where($where)->select(array('members.$'))->get('accounts'); 
相關問題