我想根据文档中的元素在mongodb中对文档评分。
这是一个示例文件:
{
_id: 5c1257cd37567213449066ce,
elements: [
{element: 'abc'},
{element: 'def'},
{element: 'ghi'},
]
}
并且以下数组的得分为+5:
var plus = ['abc'];
,以下数组的得分为-1;
var minus = ['def', 'ghi']
我想得到这个输出
{
_id: 5c1257cd37567213449066ce,
score: 3
}
答案 0 :(得分:0)
您可以遍历元素并汇总各个值。
reduce
进行迭代。{element}
用于将数组元素仅破坏为其element
值。.includes()
检查数组是否包含元素。
const o = {
_id: '5c1257cd37567213449066ce',
elements: [{
element: 'abc'
},
{
element: 'def'
},
{
element: 'ghi'
},
]
};
const plus = ['abc'];
const minus = ['def', 'ghi']
function score(arr) {
return arr.reduce((s, {
element
}) => {
if (plus.includes(element)) return s + 5;
if (minus.includes(element)) return s - 1;
return s;
}, 0);
}
o.score = score(o.elements);
console.log(o);
答案 1 :(得分:0)
您可以在aggregation
下使用
db.collection.aggregate([
{ "$project": {
"plus": {
"$map": {
"input": "$elements",
"as": "s",
"in": {
"elements": "$$s.elements",
"score": { "$cond": [{ "$in": ["$$s.element", ["abc"]] }, 5, 0] }
}
}
},
"minus": {
"$map": {
"input": "$elements",
"as": "s",
"in": {
"elements": "$$s.elements",
"score": { "$cond": [{ "$in": ["$$s.element", ["def", "ghi"]] }, 1, 0] }
}
}
}
}},
{ "$project": {
"score": { "$subtract": [{ "$sum": "$plus.score" }, { "$sum": "$minus.score" }] }
}}
])
如果您想完成一个$project
阶段
db.collection.aggregate([
{ "$project": {
"score": {
"$subtract": [
{ "$sum": {
"$map": {
"input": "$elements",
"in": { "$cond": [{ "$in": ["$$this.element", ["abc"]] }, 5, 0] }
}
}},
{ "$sum": {
"$map": {
"input": "$elements",
"in": { "$cond": [{ "$in": ["$$this.element", ["def", "ghi"]] }, 1, 0] }
}
}}
]
}
}}
])