2017-08-24 77 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重新制定它。最終的輸出應該是這樣的:

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"] } } 
      ] 
     } 
    ] 
} 

注意,$or組件由BottomTop分組。

如何將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; }