Агрегационный конвейер для фильтрации массива - PullRequest
1 голос
/ 29 апреля 2020

У меня есть массив вроде:

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 голосов
/ 29 апреля 2020

Вы можете использовать ниже агрегации

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

MongoPlayground

...