$first聚合运算符返回分组中第一个文档指定表达式的结果,只有分组文档是有序的情况下才有意义。
$first可用于下列阶段:
$bucket$bucketAuto$groupsetWindowFields
语法
{
$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,

本文详细介绍了MongoDB中的$first聚合运算符,如何在文档排序、数组操作以及处理分组内缺失值时使用,以及在setWindowFields阶段的具体应用实例。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



