我正在尝试为 mongoDB
的 aggregate
框架创建一个复杂的查询。它需要一个以编程方式添加 $and
和 $or
的组件。
这是我对象的当前结构:
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
组件按 Bottom
和 Top
分组。
如何将 inputObject
转换为所需的 outputObject
?
最佳答案
您可以结合使用 filter
和 map
方法:
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; }
关于javascript - 通过引用修改 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865710/