2017-08-24 10 views
1

mongoDBaggregateフレームワークの複雑なクエリを作成しようとしています。プログラムによって、$and$orを追加するコンポーネントが必要です。Javascriptオブジェクトを参照して変更します。

これは私のオブジェクトの現在の構造である:

const inputObject = { 
    "details.blackBottom": { "in": ["A","B","C","D"] }, 
    "details.blackTop": { "in": ["L","M"] }, 
    "details.redBottom": { "in": ["A","B","C","D"] }, 
    "details.redTop": { "in": ["L","M"] }, 
    "details.greenBottom": { "in": ["A","B","C","D"] }, 
    "details.greenTop": { "in": ["L","M"] } 
} 

はしかし、有用であるオブジェクトのために、私はそれが$or$andの両方を使用するように、それを再公式化する必要があります。最終的な出力は次のようになります。$orコンポーネントはBottomTopによってグループ化されていることを

const outputObject = { 
    "$and": [ 
     { 
      "$or" : [ 
       {"details.blackBottom": { "in": ["A","B","C","D"] }}, 
       {"details.redBottom": { "in": ["A","B","C","D"] }}, 
       {"details.greenBottom": { "in": ["A","B","C","D"] }} 
      ] 
     }, 
     { 
      "$or" : [ 
       {"details.blackTop": { "in": ["L","M"] } }, 
       {"details.redTop": { "in": ["L","M"] } }, 
       {"details.greenTop": { "in": ["L","M"] } } 
      ] 
     } 
    ] 
} 

注意してください。

inputObjectを希望のoutputObjectにするにはどうすればよいですか?

答えて

2

あなたはfiltermap方法の組み合わせであることを行うことができ:

const inputObject = { 
 
    "details.blackBottom": { "in": ["A","B","C","D"] }, 
 
    "details.blackTop": { "in": ["L","M"] }, 
 
    "details.redBottom": { "in": ["A","B","C","D"] }, 
 
    "details.redTop": { "in": ["L","M"] }, 
 
    "details.greenBottom": { "in": ["A","B","C","D"] }, 
 
    "details.greenTop": { "in": ["L","M"] } 
 
} 
 

 
const outputObject = { 
 
    $and: ["Bottom", "Top"].map(side => ({ 
 
     $or: Object.keys(inputObject) 
 
        .filter(key => key.endsWith(side)) 
 
        .map(key => ({ [key]: inputObject[key] })) 
 
    })) 
 
}; 
 

 
console.log(outputObject);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題