我在集合中使用MongoDB的聚合框架,其中每个文档都包含零个或多个“标记”的数组。标签可以出现在一个或多个文档上,但就我的目的而言,仅在一个文档上使用的标签是无用的。要查找仅出现一次的标记以及这些标记所属的文档,我可以这样做:
db.docs.aggregate([
{$unwind: "$tags"},
{$group: {_id: "$tags", count: {$sum: 1}, docId: {$last: "$_id"}}},
{$match: {count: 1}}])
但是因为我只关心一次出现的标签,所以第一个文档与最后一个文档相同,所以我会得到相同的结果:
db.docs.aggregate([
{$unwind: "$tags"},
{$group: {_id: "$tags", count: {$sum: 1}, docId: {$first: "$_id"}}},
{$match: {count: 1}}])
使用$ first或$ last与聚合框架之间存在显着的性能差异吗?直观地说,它们似乎都应该快速($ first应该检查结果是否存在,如果不存在则只写入它; $ last应该只覆盖每次存在的任何东西),但是我已经被烧掉了过去我认为相同的东西。