在MongoDB中使用$unionWith时删除重复项
在MongoDB中,聚合管道阶段执行两个集合的联合,并且它包括重复项。[$unionWith](https://database.guide/unionwith-mongodbs-equivalent-of-union-all/)
这的行为方式与SQL的类似,后者也包括重复项。相比之下,仅使用 (即不使用 ) in SQL 会删除重复项。UNION ALL``UNION``ALL
在MongoDB中,我们没有指定或类似选项的选项,因此我们需要以另一种方式减少重复项。$unionWith ALL
在MongoDB中,我们可以通过使用阶段删除重复项。$group
例
假设我们将以下文档插入到两个集合中;一个叫,另一个叫:cats``dogs
db.cats.insertMany([
{ _id: 1, name: "Fluffy", type: "Cat", weight: 5 },
{ _id: 2, name: "Scratch", type: "Cat", weight: 3 },
{ _id: 3, name: "Meow", type: "Cat", weight: 7 }
])
db.dogs.insertMany([
{ _id: 1, name: "Wag", type: "Dog", weight: 20 },
{ _id: 2, name: "Bark", type: "Dog", weight: 10 },
{ _id: 3, name: "Fluffy", type: "Dog", weight: 40 }
])
假设我们运行以下查询以返回两个集合中的所有名称:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
结果:
{ “name” : “Fluffy” } { “name” : “Scratch” } { “name” : “Meow” } { “name” : “Wag” } { “name” : “Bark” } { “name” : “Fluffy” }
我们可以看到Fluffy这个名字出现了两次。这是因为我们的系列中有两个 Fluffys——一个在系列中,一个在系列中。cats``dogs
如果我们乐于拥有重复值,这很好。但是,如果我们不这样做呢?如果我们只想要两个集合中的不同名称列表怎么办?
这就是舞台的用武之地。$group
我们可以将阶段添加到字段中,使其看起来像这样:$group``name
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] )
结果:
{ “_id” : “Meow” } { “_id” : “Bark” } { “_id” : “Scratch” } { “_id” : “Wag” } { “_id” : “Fluffy” }
这次我们只得到 5 个文档而不是 6 个,而且只有一个 Fluffy。