用于过滤阵列的聚合管道

时间:2020-04-29 12:04:37

标签: mongodb mongoose mongodb-query aggregation-framework

我有一个类似的数组:

const tags = ["a", "b", "c"];

我的收藏集如下:

[{
  _id: asdsadasd,
  tagName: "a"
 },
 {
  _id: qweqewqe,
  tagName: "d"
 }
]

我想过滤tags数组,使其不包含集合中的任何标签(tagName字段)。

示例输出:

["b", "c"]

这是我尝试过的:

[
  {
    '$group': {
      '_id': null, 
      'tags': {
        '$push': '$tagName'
      }
    }
  }, {
    '$project': {
      'filteredTags': {
        '$filter': {
          'input': tags, 
          'as': 'item', 
          'cond': {
            '$not': {
              '$in': [
                '$$item', '$tags'
              ]
            }
          }
        }
      }
    }
  }
]

这工作正常,但是我想知道是否存在使用聚合管道或以任何方式执行此操作的更有效方法。

1 个答案:

答案 0 :(得分:0)

您可以使用以下汇总

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "data": { "$push": "$tagName" }
  }},
  { "$project": {
    "tags": {
      "$setDifference": [
        ["a", "b", "c"],
        "$data"
      ]
    }
  }}
])

MongoPlayground