On this page本页内容
$fill
New in version 5.3.在版本5.3中新增。
Populates 填充文档中的null and missing field values within documents.null字段值和缺失字段值。
You can use 您可以使用$fill to populate missing data points:$fill填充缺少的数据点:
The $fill stage has this syntax:$fill阶段具有以下语法:
{
$fill: {
partitionBy: <expression>,
partitionByFields: [ <field 1>, <field 2>, ... , <field n> ],
sortBy: {
<sort field 1>: <sort order>,
<sort field 2>: <sort order>,
...,
<sort field n>: <sort order>
},
output: {
<field 1>: { value: <expression> },
<field 2>: { method: <string> },
...
}
}
}
The $fill stage takes a document with these fields:$fill阶段接受包含以下字段的文档:
partitionBy |
| |
partitionByFields |
| |
sortBy |
|
|
output |
| |
output.<field> |
|
partitionByFields如果$fill returns an error if any field name in the partitionByFields array:partitionByFields数组中有任何字段名,则$fill返回错误:
$.$开始。linearThe linear fill method fills null and missing fields using linear interpolation based on the surrounding non-null values in the sequence.linear填充方法使用基于序列中周围非null值的线性插值来填充null字段和缺失字段。
For each document where the field is 对于每个字段为null or missing, linearFill fills those fields in proportion to the missing value range between surrounding non-null values according to the sortBy order. null或缺失的文档,linearFill根据sortBy顺序按照周围非null值之间的缺失值范围按比例填充这些字段。To determine the values for missing fields, 要确定缺失字段的值,linearFill uses:linearFill使用:
null values.null值的差异。null fields to fill between the surrounding values.null字段数。The linear method can fill multiple consecutive null values if those values are preceded and followed by non-null values according to the sortBy order.linear方法可以根据排序顺序填充多个连续的null值,如果这些值之前和之后是非null值。
If a collection contains these documents:如果集合包含以下文档:
{ index: 0, value: 0 },
{ index: 1, value: null },
{ index: 2, value: null },
{ index: 3, value: null },
{ index: 4, value: 10 }
After using the 使用linear fill method to fill the null values, the documents become:linear填充方法填充null值后,文档变为:
{ index: 0, value: 0 },
{ index: 1, value: 2.5 },
{ index: 2, value: 5 },
{ index: 3, value: 7.5 },
{ index: 4, value: 10 }
null values that are not preceded and followed by non-null values remain null.null值之前和之后的null值保持为null。To use the 要使用linear fill method, you must also use the sortBy field to sort your data.linear填充方法,还必须使用sortBy字段对数据进行排序。
For a complete example using the 有关使用linear fill method, see Fill Missing Field Values with Linear Interpolation.linear填充方法的完整示例,请参阅使用线性插值填充缺少的字段值。
locflocf stands for last observation carried forward.代表结转的最后观察。
If a field being filled contains both 如果要填充的字段同时包含null and non-null values, locf sets the null and missing values to the field's last known non-null value according to the sortBy order.null值和非null值,则locf会根据sortBy顺序将null值和缺失值设置为字段的最后一个已知非空值。
locf fill method, you must also use the sortBy field to sort your data.locf填充方法,还必须使用sortBy字段对数据进行排序。For a complete example using the 有关使用locf fill method, see Fill Missing Field Values Based on the Last Observed Value.locf填充方法的完整示例,请参阅基于上次观察到的值填充缺少的字段值。
$fill and Aggregation Operators$fill和聚合运算符的比较To fill 要填充文档中的null and missing field values within a document you can use:null字段值和缺失字段值,可以使用:
When you use the 使用$fill stage, the field you specify in the output is the same field used as the source data.$fill阶段时,输出中指定的字段与源数据中使用的字段相同。
The $linearFill and $locf aggregation operators.$linearFill和$locf聚合运算符。
When you 使用$linearFill or $locf, you can set values for a different field than the field used as the source data.$linearFill或$locf时,可以为不同于用作源数据的字段设置值。
The examples in this section show how to use 本节中的示例显示了如何使用$fill to fill missing values:$fill填充缺失的值:
A shoe store maintains a 鞋店维护一个dailySales collection that contains a document summarizing each day's sales. dailySales集合,其中包含一个总结每天销售的文档。The shoe store sells these types of shoes:鞋店销售以下类型的鞋:
bootssandalssneakersCreate the following 创建以下dailySales collection:dailySales集合:
db.dailySales.insertMany( [
{
"date": ISODate("2022-02-02"),
"bootsSold": 10,
"sandalsSold": 20,
"sneakersSold": 12
},
{
"date": ISODate("2022-02-03"),
"bootsSold": 7,
"sneakersSold": 18
},
{
"date": ISODate("2022-02-04"),
"sneakersSold": 5
}
] )
Not all of the documents in the dailySales collection contain each shoe type. dailySales集合中的并非所有文档都包含每种鞋型。If a shoe type is missing, it means there were no shoes of that type sold on the corresponding date.如果缺少鞋型,则意味着在相应日期没有销售该类型的鞋。
The following example uses 以下示例使用$fill to set the quantities sold to 0 for the missing shoe types for each day's sales:$fill将每天销售的缺失鞋型的销售数量设置为0:
db.dailySales.aggregate( [
{
$fill:
{
output:
{
"bootsSold": { value: 0 },
"sandalsSold": { value: 0 },
"sneakersSold": { value: 0 }
}
}
}
] )
In the preceding pipeline:在前面的管道中:
$filloutput specifies:指定:
0.0。Example output:示例输出:
[
{
_id: ObjectId("6202df9f394d47411658b51e"),
date: ISODate("2022-02-02T00:00:00.000Z"),
bootsSold: 10,
sandalsSold: 20,
sneakersSold: 12
},
{
_id: ObjectId("6202df9f394d47411658b51f"),
date: ISODate("2022-02-03T00:00:00.000Z"),
bootsSold: 7,
sneakersSold: 18,
sandalsSold: 0
},
{
_id: ObjectId("6202df9f394d47411658b520"),
date: ISODate("2022-02-04T00:00:00.000Z"),
sneakersSold: 5,
bootsSold: 0,
sandalsSold: 0
}
]
Create a 创建一个stock collection that contains tracks a single company's stock price at hourly intervals:stock集合,包含每小时跟踪一家公司的股票价格:
db.stock.insertMany( [
{
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
time: ISODate("2021-03-08T10:00:00.000Z"),
},
{
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
time: ISODate("2021-03-08T12:00:00.000Z")
},
{
time: ISODate("2021-03-08T13:00:00.000Z")
},
{
time: ISODate("2021-03-08T14:00:00.000Z"),
price: 485
}
] )
The 集合中的某些文档缺少price field is missing for some of the documents in the collection.price字段。
To populate the missing 要使用线性插值填充缺失的price values using linear interpolation, use $fill with the linear fill method:price值,请使用$fill和linear填充方法:
db.stock.aggregate( [
{
$fill:
{
sortBy: { time: 1 },
output:
{
"price": { method: "linear" }
}
}
}
] )
In the preceding pipeline:在前面的管道中:
$fillsortBy: { time: 1 }time field in ascending order, from earliest to latest.time字段按升序对文档进行排序,从最早到最晚。output specifies:指定:
price{ method: "linear" }linear fill method fills missing price values using linear interpolation based on the surrounding price values in the sequence.linear填充方法使用基于序列中周围price值的线性插值来填充缺失的price值。Example output:示例输出:
[
{
_id: ObjectId("620ad41c394d47411658b5e9"),
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
_id: ObjectId("620ad41c394d47411658b5ea"),
time: ISODate("2021-03-08T10:00:00.000Z"),
price: 507.5
},
{
_id: ObjectId("620ad41c394d47411658b5eb"),
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
_id: ObjectId("620ad41c394d47411658b5ec"),
time: ISODate("2021-03-08T12:00:00.000Z"),
price: 505
},
{
_id: ObjectId("620ad41c394d47411658b5ed"),
time: ISODate("2021-03-08T13:00:00.000Z"),
price: 495
},
{
_id: ObjectId("620ad41c394d47411658b5ee"),
time: ISODate("2021-03-08T14:00:00.000Z"),
price: 485
}
]
Create a 创建一个restaurantReviews collection that contains review scores for a single restaurant over time:restaurantReviews集合,其中包含单个餐厅随时间变化的审核分数:
db.restaurantReviews.insertMany( [
{
date: ISODate("2021-03-08"),
score: 90
},
{
date: ISODate("2021-03-09"),
score: 92
},
{
date: ISODate("2021-03-10")
},
{
date: ISODate("2021-03-11")
},
{
date: ISODate("2021-03-12"),
score: 85
},
{
date: ISODate("2021-03-13")
}
] )
The 集合中的某些文档缺少score field is missing for some of the documents in the collection.score字段。
To populate the missing 要填充缺失的score fields and ensure that there are no gaps in the data, use $fill. score字段并确保数据中没有空白,请使用$fill。In the following example, 在以下示例中,$fill uses the locf fill method to fill the missing score values with the previous score in the sequence:$fill使用locf填充方法用序列中的前一个score填充缺失的score值:
db.restaurantReviews.aggregate( [
{
$fill:
{
sortBy: { date: 1 },
output:
{
"score": { method: "locf" }
}
}
}
] )
In the preceding pipeline:在前面的管道中:
$fillscore values.score值。sortBy: { date: 1 }date field in ascending order, from earliest to latest.date字段按升序对文档进行排序,从最早到最晚。output specifies:指定:
score{ method: "locf" }locf fill method fills missing score values with the last observed score in the sequence.locf填充方法用序列中最后观察到的score填充缺失的score值。Example output:示例输出:
[
{
_id: ObjectId("62040bc9394d47411658b553"),
date: ISODate("2021-03-08T00:00:00.000Z"),
score: 90
},
{
_id: ObjectId("62040bc9394d47411658b554"),
date: ISODate("2021-03-09T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b555"),
date: ISODate("2021-03-10T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b556"),
date: ISODate("2021-03-11T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b557"),
date: ISODate("2021-03-12T00:00:00.000Z"),
score: 85
},
{
_id: ObjectId("62040bc9394d47411658b558"),
date: ISODate("2021-03-13T00:00:00.000Z"),
score: 85
}
]
Consider the previous example with restaurant reviews but instead of tracking a single restaurant, the collection now contains reviews for multiple restaurants.考虑前面的餐馆评论示例,但该集合现在包含多家餐馆的评论,而不是跟踪单个餐馆。
Create a collection named 创建名为restaurantReviewsMultiple and populate the collection with these documents:restaurantReviewsMultiple的集合,并使用以下文档填充该集合:
db.restaurantReviewsMultiple.insertMany( [
{
date: ISODate("2021-03-08"),
restaurant: "Joe's Pizza",
score: 90
},
{
date: ISODate("2021-03-08"),
restaurant: "Sally's Deli",
score: 75
},
{
date: ISODate("2021-03-09"),
restaurant: "Joe's Pizza",
score: 92
},
{
date: ISODate("2021-03-09"),
restaurant: "Sally's Deli"
},
{
date: ISODate("2021-03-10"),
restaurant: "Joe's Pizza"
},
{
date: ISODate("2021-03-10"),
restaurant: "Sally's Deli",
score: 68
},
{
date: ISODate("2021-03-11"),
restaurant: "Joe's Pizza",
score: 93
},
{
date: ISODate("2021-03-11"),
restaurant: "Sally's Deli"
}
] )
The 集合中的某些文档缺少score field is missing for some of the documents in the collection.score字段。
To populate the missing 要填充缺失的score fields and ensure that there are no gaps in the data, use $fill. score字段并确保数据中没有空白,请使用$fill。In the following example, 在以下示例中,$fill uses the locf fill method to fill the missing score values with the previous score in the sequence:$fill使用locf填充方法用序列中的前一个score填充缺失的score值:
db.restaurantReviewsMultiple.aggregate( [
{
$fill:
{
sortBy: { date: 1 },
partitionBy: { "restaurant": "$restaurant" },
output:
{
"score": { method: "locf" }
}
}
}
] )
In the preceding pipeline:在前面的管道中:
$fillscore values.score值。sortBy: { date: 1 }date field in ascending order, from earliest to latest.date字段按升序对文档进行排序,从最早到最晚。partitionBy: { "restaurant": "$restaurant" }restaurant. restaurant划分数据。Joe's Pizza and Sally's Deli.output specifies:指定:
score{ method: "locf" }locf fill method fills missing score values with the last observed score in the sequence.locf填充方法用序列中最后观察到的score填充缺失的score值。Example output:示例输出:
[
{
_id: ObjectId("620559f4394d47411658b58f"),
date: ISODate("2021-03-08T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 90
},
{
_id: ObjectId("620559f4394d47411658b591"),
date: ISODate("2021-03-09T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 92
},
{
_id: ObjectId("620559f4394d47411658b593"),
date: ISODate("2021-03-10T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 92
},
{
_id: ObjectId("620559f4394d47411658b595"),
date: ISODate("2021-03-11T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 93
},
{
_id: ObjectId("620559f4394d47411658b590"),
date: ISODate("2021-03-08T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 75
},
{
_id: ObjectId("620559f4394d47411658b592"),
date: ISODate("2021-03-09T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 75
},
{
_id: ObjectId("620559f4394d47411658b594"),
date: ISODate("2021-03-10T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 68
},
{
_id: ObjectId("620559f4394d47411658b596"),
date: ISODate("2021-03-11T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 68
}
]