2017-12-11 3 views
0

私はロールベースのメニューを作成したいと思っています。キャンドラー、puvendorフォームここで私はフォーム名は何も分からず、フォーム名も任意です文書で定義されている場所をので、どのように私は親フィールド値に基づいてすべてのレベルにすべてのドキュメントフィールドを含めます

[ { 
"_id" : ObjectId("57ef642fd4f27bb41b697314"), 
"menuDesc" : "Cash Module", 
"formName" : "", 
"subMenu1" : [ 
    { 
     "menuDesc" : "Setup", 
     "formName" : "", 
     "subMenu2" : [ 
      { 
       "menuDesc" : "Setup Bank Details", 
       "formName" : "cabank", 
      } 
     ] 
    }, 
    { 
     "menuDesc" : "Vouchers", 
     "formName" : "", 
     "subMenu2" : [ 
      { 
       "menuDesc" : "Maintain Cash Voucher", 
       "formName" : "cavoucher", 
      }, 
      { 
       "menuName" : "Paid Voucher", 
       "menuDesc" : "Maintain Paid Voucher", 
       "formName" : "capaidvchr", 
      } 
     ] 
    } 
    ] 
}, 
{ 
"_id" : ObjectId("57ef6464d4f27bb41b697316"), 
"menuDesc" : "Purchase Module", 
"formName" : "", 
"subMenu1" : [ 
    { 
     "menuDesc" : "Maintain Vendors", 
     "formName" : "puvendor" 
     } 
] 
}] 

私は

[{ 
"_id" : ObjectId("57ef642fd4f27bb41b697314"), 
"menuDesc" : "Cash Module", 
"formName" : "", 
"subMenu1" : [ 
    { 
     "menuDesc" : "Vouchers", 
     "formName" : "", 
     "subMenu2" : [ 
      { 
       "menuDesc" : "Maintain Cash Voucher", 
       "formName" : "cavoucher", 
      } 
     ] 
    } 
    ] 
},{ 
"_id" : ObjectId("57ef6464d4f27bb41b697316"), 
"menuDesc" : "Purchase Module", 
"formName" : "", 
"subMenu1" : [ 
    { 
     "menuDesc" : "Maintain Vendors", 
     "formName" : "puvendor" 
     } 
] 
}} 

を探していた結果と一緒に結果のみマッチしたコンテンツを取得することができます私はレベルが値となるか分かりませんマッチした可能な解決策はありますか?

答えて

0

MongoDBのaggregation pipelineを使用して実行できます。ここではあなたのケースで

は、次の2つのネストされた配列 subMenu1、その後 subMenu2最初 $unwindそれらをし、結果を達成するために $matchを使用しています。

モンゴシェルクエリ

db.collection.aggregate([ 
    {$unwind:"$subMenu1"}, 
    {$unwind:"$subMenu1.subMenu2"}, 
    {$match:{"subMenu1.subMenu2.formName":"cavoucher"}} 
]) 
+0

私の結果をオブジェクトに変換すると、私は私のサブ文書が配列になるようにしたい。 –

0

あなたは各レベルでformNameフォームの値に基づいてアクセスを処理するために$redactを使用することができます。

値が ""または "" cavoucher "、" puvendor "を含む場合、プロセスは次のレベルに$$DESCEND、そうでない場合は$$PRUNEそのレベルのドキュメントになります。

このプロセスは、すべてのレベルが完了するまで続きます。

db.collection_name.aggregate([{ 
    "$redact": { 
     "$cond": [ 
      { 
      $or: [ 
       {$eq: ["$formName", ""]}, 
       {"$setIsSubset":[["$formName"],["cavoucher","puvendor"]]} 
      ] 
      }, 
     "$$DESCEND", 
     "$$PRUNE" 
     ] 
    } 
}]) 
+0

助けてくれてありがとう。 –

+0

どのようにして一致した文書を取得し、どのサブ文書に一致した値があるか。現在の解決策は私にformName = ""を持つすべてのドキュメントを与えます。 –

+0

ようこそ。一致する子ドキュメントにも、フォーム名が空の親ドキュメントがあるため、両方向に表示することはできません。したがって、あるレベルの子ドキュメントを処理するredactでは、親ドキュメントを保持して処理しておき、その子ドキュメントに空のフォーム名がない場合、ドキュメントを保持または削除するかどうかを確認します。 – Veeram

関連する問題