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
返回错误:
$
.$
开始。linear
The 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
填充方法的完整示例,请参阅使用线性插值填充缺少的字段值。
locf
locf
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:鞋店销售以下类型的鞋:
boots
sandals
sneakers
Create 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:在前面的管道中:
$fill
output
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:在前面的管道中:
$fill
sortBy: { 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:在前面的管道中:
$fill
score
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:在前面的管道中:
$fill
score
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 } ]