MongoDB $setUnion 运算符介绍

$setUnion 是 MongoDB 中的一个聚合运算符,用于将两个数组合并成一个数组,同时去重。

语法

$setUnion 的语法如下:

{ $setUnion: [ <array1>, <array2>, ... ] }

其中,<array1><array2> 是需要合并的数组。

使用场景

$setUnion 可以应用在需要将两个数组合并成一个且去除重复项的场景中,例如:

  • 合并多个标签数组为一个唯一的标签列表;
  • 将两个用户的好友列表合并成一个唯一的好友列表。

示例

假设我们有一个存储用户数据的 users 集合,其中每个文档包含以下字段:

{
  "_id" : ObjectId("61f3c8e1572a6a846a6a5f0f"),
  "name" : "Alice",
  "hobbies" : [ "reading", "dancing", "travelling" ]
}

现在,我们想要查询所有用户的兴趣爱好,以及一个唯一的兴趣爱好列表。我们可以使用以下聚合管道:

db.users.aggregate([
  {
    $group: {
      _id: null,
      hobbies: { $push: "$hobbies" }
    }
  },
  {
    $project: {
      _id: 0,
      hobbies: {
        $reduce: {
          input: "$hobbies",
          initialValue: [],
          in: { $setUnion: "$$value" }
        }
      }
    }
  }
])

在上述聚合管道中,我们首先使用 $group 将所有用户的兴趣爱好放到一个数组中,然后使用 $reduce$setUnion 将这些数组合并成一个唯一的兴趣爱好列表。

以下是示例数据和结果:

示例数据:

_id name hobbies
ObjectId(“61f3c8e1572a6a846a6a5f0f”) Alice [“reading”, “dancing”, “travelling”]
ObjectId(“61f3c8e2572a6a846a6a5f10”) Bob [“reading”, “painting”]
ObjectId(“61f3c8e3572a6a846a6a5f11”) Carol [“travelling”, “cooking”]

聚合结果:

{ "hobbies" : [ "reading", "dancing", "travelling", "painting", "cooking" ] }

结论

$setUnion 运算符是一个非常有用的聚合运算符,可以将多个数组合并成一个唯一的数组。它可以应用于许多场景,例如合并多个标签数组,合并多个好友列表等。