通过数组聚合对文档评分

时间:2018-12-13 13:24:08

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我想根据文档中的元素在mongodb中对文档评分。
这是一个示例文件:

{
  _id: 5c1257cd37567213449066ce,
  elements: [
   {element: 'abc'},
   {element: 'def'},
   {element: 'ghi'},
  ]
}

并且以下数组的得分为+5:

var plus = ['abc'];

,以下数组的得分为-1;

var minus = ['def', 'ghi']

我想得到这个输出

{
  _id: 5c1257cd37567213449066ce,
  score: 3
}

2 个答案:

答案 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] }
          }
        }}
      ]
    }
  }}
])