$first
聚合运算符返回分组中第一个文档指定表达式的结果,只有分组文档是有序的情况下才有意义。
$first
可用于下列阶段:
$bucket
$bucketAuto
$group
setWindowFields
语法
{
$first: <expression> }
$
不需要任何参数。
使用
定义文档顺序
- 在
$setWindowFields
阶段,需要使用sortBy
字段来定义文档顺序 - 对于其他管道阶段,可以在其前面增加一个
$sort
阶段
数组操作
如果表达式解析为数组,则:
- 对于一组文档,
$first
返回第一个文档的整个数组,不会遍历数组元素,类似于$group
和$setWindowFields
阶段。 - 对于单个文档,
$first
则返回数组的第一个元素,这类似于$addFields
阶段
缺失值的处理
分组内的文档可能会有字段或字段值缺失,对于这种情况:
- 如果前一管道阶段没有文档输入,则
$group
阶段什么也不返回 - 如果字段
$first
处理的字段不存在,则返回null - 对于
$setWindowFields
,空窗口返回null,比如分区的第一个文档的文档窗口为{ documents:[ -1, -1] }
举例
使用下面的脚本创建sales
集合:
db.sales.insertMany( [
{
"_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:05:00Z") },
{
"_id" : 6, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-15T12:05:10Z") },
{
"_id" : 7,