2013-02-26 12 views
11

私はこのようなコレクションの文書を持っています。私はform_Id:1とFunction_Id:2でレコードを探して、mongoクエリを書く方法が必要です。条件付きサブ文書を見つけるためのMongoクエリの書き方

"Form_Id" : 1, 
"Function" : [{ 
    "Function_Id" : 1, 
    "Role" : [{ 
     "Role_Id" : 1, 
     "UserId" : ["Admin", "001"] 
    }] 
}, { 
    "Function_Id" : 2, 
    "Role" : [{ 
     "Role_Id" : 2, 
     "UserId" : ["Admin", "005"] 
    }] 
}] 
+0

は、任意の可能性は、この '{ 」のようなレコードを取得することですUser_d ":" Admin "、" 005 "]" Role_Id ":2、 "} 'を私の結果として返します。 – siva

答えて

24

あなたは、ドット表記を使用することができますし、これを行うに$位置射影演算子:

db.test.find({Form_Id: 1, 'Function.Function_Id': 2}, {_id: 0, 'Function.$': 1}) 

リターン:

{"Function": [{"Function_Id": 2, "Role": [{"Role_Id": 2, "UserId": ["Admin", "005"]}]}]} 
+0

@JhonnyHK私はあなたの答えを試しました、このような結果になりました{{"Function":[{}、{}]} '、何が間違っているのか分かりますかこれで – siva

+0

@JhonnyHK私が間違った場所を知りませんでした。あなたのクエリは正確な結果を返しました。私は 'var Logs = db 'と同じようにC#アプリケーションで同じことを試みました。SetFields(Fields.Include( "Function。$")); 'は正しいことをしています。GetCollection (" Access_Rights ")FindAs (クエリ).SetFields(Fields.Exclude(" _ id "、Function.Role"私を案内してください。 – siva

5

ファンクションキーは配列であるため、$ match演算子を使用するには、まず$ unwind演算子を使用する必要があります。 http://docs.mongodb.org/manual/reference/aggregation/unwind/ そして、あなたはだからあなたのクエリがドキュメントの_idを表示するデフォルトのmongoでは、この

db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}}]) 

のようになります。あなたはhttp://docs.mongodb.org/manual/reference/aggregation/match/

をしたい文書を検索するには、$マッチ演算子を使用します。だから、あなたは、単に指定されていない、あなたはform_idを表示させたくない場合は、関連するものを照合した後、あなたは$プロジェクトのオペレーターhttp://docs.mongodb.org/manual/reference/aggregation/project/

 db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Form_id":1,"Function":1}}]) 

を使用することができ、_idを表示したくない場合form_idをクエリのプロジェクト部分に追加します。デフォルトでは、mongoは値が1のキーのみを表示します。キーが指定されていない場合は表示されません。

db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Function":1}}]) 
+0

私はあなたの答えをデータベースで試してみましたが、タイプエラー集計は関数シェルではありません。 – siva

+0

回答を投稿する前にすべてのクエリを試してみたので、どのバージョンのmongoをお持ちですか?集約はmongo 2.1以降でサポートされています。[リンク](http://docs.mongodb.org/manual/applications/aggregation/#overview) – ann

+0

私はmongodbのバージョンwin32-i386-2.0.7を使用しています。このバージョンでは試行できませんが、このバージョンではこれを行う方法はありますか? – siva

関連する問題