参考 > 参考 > 经营者 > 聚合管道运营商 > $ addToSet(聚合)
在本页面
$addToSet
返回所有唯一值的数组,这些值是通过将表达式应用于一组按键共享相同组的文档中的每个文档而得出的。未指定输出数组中元素的顺序。
$addToSet仅在$group舞台上可用 。
$group
$addToSet 具有以下语法:
{ $addToSet: <expression> }
有关表达式的更多信息,请参见 表达式。
如果表达式的值是一个数组,$addToSet则将整个数组作为单个元素附加。
如果表达式的值是一个文档,则如果数组中的另一个文档与要添加的文档完全匹配,则MongoDB会确定该文档是重复的。也就是说,现有文档具有完全相同的字段和值,并且顺序完全相同。
从版本4.2.3(和4.0.14、3.6.17 $addToSet)开始,即使db.collection.aggregate()使用allowDiskUse:true运行,内存限制也为100 MiB(100 * 1024 * 1024) 。
db.collection.aggregate()
有关更多信息,请参见聚集管道限制。
考虑sales包含以下文档的集合:
sales
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") } { "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") } { "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") } { "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:12:00Z") }
date以下操作按字段的日期和年份分组,以下操作使用$addToSet累加器计算每组出售的唯一商品的列表:
date
db.sales.aggregate( [ { $group: { _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } }, itemsSold: { $addToSet: "$item" } } } ] )
该操作返回以下结果:
{ "_id" : { "day" : 46, "year" : 2014 }, "itemsSold" : [ "xyz", "abc" ] } { "_id" : { "day" : 34, "year" : 2014 }, "itemsSold" : [ "xyz", "jkl" ] } { "_id" : { "day" : 1, "year" : 2014 }, "itemsSold" : [ "abc" ] }