2012-03-15 12 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

また、あなたはここで

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

$ elemMatch

を使用する場合がありますこするです - あなたは上がりません」 mongoはそれらの要素が一致するとドキュメント全体を返すため、一致する配列項目を取得できるようになります。コードクライアント側を解析する必要があります。モンゴには「一致する配列だけを返す」という答えがありません。

+2

まあ:

ですから、このような何かを行うことができます。大きな注意点:投影で使用される場合elemMatchは最初に一致する要素のみを返します。残念ながら複数のマッチを返す方法はありません。参照:http://docs.mongodb.org/manual/reference/projection/elemMatch/ – UpTheCreek

4

これは古い質問ですが、MongoDB 2.2以降では、一致する配列要素だけが結果に含まれるように投影で$ positional operatorを使用することができます。あなたも、あなたはあなたの結果にちょうど一致する要素を取得する投影と同じ$ elemMatch基準を使用することができます2.2のように、

$this->cimongo->where($where)->select(array('members.$'))->get('accounts'); 
関連する問題