On this page本页内容
Starting in MongoDB 5.0, map-reduce is deprecated:从MongoDB 5.0开始,map-reduce已被弃用:
$group
, $merge
, and others.$group
、$merge
等)重写map-reduce操作。$accumulator
and $function
aggregation operators, available starting in version 4.4. $accumulator
和$function
聚合运算符,这些运算符从4.4版开始提供。For examples of aggregation pipeline alternatives to map-reduce, see:有关map-reduce的聚合管道备选方案的示例,请参阅:
db.collection.mapReduce(map,reduce, { <options> })
This is a 这是一种mongosh
method. mongosh
方法。This is not the documentation for 这不是Node.js或其他编程语言特定驱动程序方法的文档。Node.js
or other programming language specific driver methods.
In most cases, mongosh
methods work the same way as the legacy mongo
shell methods. However, some legacy methods are unavailable in mongosh
.
For the legacy mongo
shell documentation, refer to the documentation for the corresponding MongoDB Server release:
For MongoDB API drivers, refer to the language specific MongoDB driver documentation.
The db.collection.mapReduce()
method provides a wrapper around the 方法提供mapReduce
command.mapReduce
命令的包装。
Starting in version 4.4, MongoDB ignores the verbose option.从4.4版开始,MongoDB将忽略verbose
选项。
Starting in version 4.2, MongoDB deprecates:从4.2版开始,MongoDB不推荐:
nonAtomic: false
选项的显式规范。db.collection.mapReduce()
has the following syntax:具有以下语法:
db.collection.mapReduce( <map>, <reduce>, { out: <collection>, query: <document>, sort: <document>, limit: <number>, finalize: <function>, scope: <document>, jsMode: <boolean>, verbose: <boolean>, bypassDocumentValidation: <boolean> } )
db.collection.mapReduce()
takes the following parameters:采用以下参数:
map | JavaScript or String |
|
reduce | JavaScript or String |
|
options | document | db.collection.mapReduce() .db.collection.mapReduce() 指定附加参数的文档。
|
The following table describes additional arguments that 下表描述了db.collection.mapReduce()
can accept.db.collection.mapReduce()
可以接受的其他参数。
out | string or document |
|
query | document | map function.map 函数的文档。 |
sort | document | Sorts the input documents. This option is useful for optimization. For example, specify the sort key to be the same as the emit key so that there are fewer reduce operations. |
limit | number | Specifies a maximum number of documents for the input into the map function.
|
finalize | Javascript or String |
|
scope | document | Specifies global variables that are accessible in the map , reduce and finalize functions.
|
jsMode | boolean | Specifies whether to convert intermediate data into BSON format between the execution of the Defaults to If
If
|
verbose | boolean | Specifies whether to include the Defaults to Starting in MongoDB 4.4, this option is ignored. The result information always excludes the |
collation | document | Optional. Specifies the collation to use for the operation. Collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation option has the following syntax: collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } When specifying collation, the If the collation is unspecified but the collection has a default collation (see If no collation is specified for the collection or for the operations, MongoDB uses the simple binary comparison used in prior versions for string comparisons. You cannot specify multiple collations for an operation. For example, you cannot specify different collations per field, or if performing a find with a sort, you cannot use one collation for the find and another for the sort. |
bypassDocumentValidation | boolean | mapReduce to bypass document validation during the operation. This lets you insert documents that do not meet the validation requirements.
|
map-reduce operations
and $where
operator expressions cannot access certain global functions or properties, such as db
, that are available in mongosh
.
The following JavaScript functions and properties are available to map-reduce operations
and $where
operator expressions:
Available Properties | Available Functions | |
---|---|---|
args MaxKey MinKey | assert() BinData() DBPointer() DBRef() doassert() emit() gc() HexData() hex_md5() isNumber() isObject() ISODate() isString() | Map() MD5() NumberInt() NumberLong() ObjectId() print() printjson() printjsononeline() sleep() Timestamp() tojson() tojsononeline() tojsonObject() UUID() version() |
map
FunctionThe map
function is responsible for transforming each input document into zero or more documents. It can access the variables defined in the scope
parameter, and has the following prototype:
function() { ... emit(key, value); }
The map
function has the following requirements:
map
function, reference the current document as this
within the function.map
function should not access the database for any reason.map
function should be pure, or have no impact outside of the function (i.e. side effects.)map
function may optionally call emit(key,value)
any number of times to create an output document associating key
with value
.Starting in MongoDB 4.4, mapReduce
no longer supports the deprecated BSON type JavaScript code with scope (BSON type 15) for its functions. The map
function must be either BSON type String (BSON type 2) or BSON type JavaScript (BSON type 13). To pass constant values which will be accessible in the map
function, use the scope
parameter.
map
function has been deprecated since version 4.2.1.The following map
function will call emit(key,value)
either 0 or 1 times depending on the value of the input document's status
field:
function() { if (this.status == 'A') emit(this.cust_id, 1); }
The following map
function may call emit(key,value)
multiple times depending on the number of elements in the input document's items
field:
function() { this.items.forEach(function(item){ emit(item.sku, 1); }); }
reduce
FunctionThe reduce
function has the following prototype:
function(key, values) { ... return result; }
The reduce
function exhibits the following behaviors:
reduce
function should not access the database, even to perform read operations.reduce
function should not affect the outside system.reduce
function for a key that has only a single value. The values
argument is an array whose elements are the value
objects that are "mapped" to the key
.reduce
function more than once for the same key. In this case, the previous output from the reduce
function for that key will become one of the input values to the next reduce
function invocation for that key.reduce
function can access the variables defined in the scope
parameter.reduce
must not be larger than half of MongoDB's maximum BSON document size. This requirement may be violated when large documents are returned and then joined together in subsequent reduce
steps.Starting in MongoDB 4.4, mapReduce
no longer supports the deprecated BSON type JavaScript code with scope (BSON type 15) for its functions. The reduce
function must be either BSON type String (BSON type 2) or BSON type JavaScript (BSON type 13). To pass constant values which will be accessible in the reduce
function, use the scope
parameter.
reduce
function has been deprecated since version 4.2.1.Because it is possible to invoke the reduce
function more than once for the same key, the following properties need to be true:
value
emitted by the map
function.the reduce
function must be associative. The following statement must be true:
reduce(key, [ C, reduce(key, [ A, B ]) ] ) == reduce( key, [ C, A, B ] )
the reduce
function must be idempotent. Ensure that the following statement is true:
reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )
the reduce
function should be commutative: that is, the order of the elements in the valuesArray
should not affect the output of the reduce
function, so that the following statement is true:
reduce( key, [ A, B ] ) == reduce( key, [ B, A ] )
out
OptionsYou can specify the following options for the out
parameter:
This option outputs to a new collection, and is not available on secondary members of replica sets.
out: <collectionName>
Starting in version 4.2, MongoDB deprecates:
This option is only available when passing a collection that already exists to out
. It is not available on secondary members of replica sets.
out: { <action>: <collectionName> [, db: <dbName>] [, sharded: <boolean> ] [, nonAtomic: <boolean> ] }
When you output to a collection with an action, the out
has the following parameters:
<action>
: Specify one of the following actions:
replace
Replace the contents of the <collectionName>
if the collection with the <collectionName>
exists.
merge
Merge the new result with the existing result if the output collection already exists. If an existing document has the same key as the new result, overwrite that existing document.
reduce
Merge the new result with the existing result if the output collection already exists. If an existing document has the same key as the new result, apply the reduce
function to both the new and the existing documents and overwrite the existing document with the result.
db
:
Optional. 可选。The name of the database that you want the map-reduce operation to write its output. By default this will be the same database as the input collection.
sharded
:
Starting in version 4.2, the use of the sharded
option is deprecated.
Optional. 可选。If true
and you have enabled sharding on output database, the map-reduce operation will shard the output collection using the _id
field as the shard key.
If true
and collectionName
is an existing unsharded collection, map-reduce fails.
nonAtomic
:
Starting in MongoDB 4.2, explicitly setting nonAtomic
to false
is deprecated.
Optional. 可选。Specify output operation as non-atomic. This applies onlyto the merge
and reduce
output modes, which may take minutes to execute.
By default nonAtomic
is false
, and the map-reduce operation locks the database during post-processing.
If nonAtomic
is true
, the post-processing step prevents MongoDB from locking the database: during this time, other clients will be able to read intermediate states of the output collection.
Perform the map-reduce operation in memory and return the result. This option is the only available option for out
on secondary members of replica sets.
out: { inline: 1 }
The result must fit within the maximum size of a BSON document.
finalize
FunctionThe finalize
function has the following prototype:
function(key, reducedValue) { ... return modifiedObject; }
The finalize
function receives as its arguments a key
value and the reducedValue
from the reduce
function. Be aware that:
finalize
function should not access the database for any reason.finalize
function should be pure, or have no impact outside of the function (i.e. side effects.)finalize
function can access the variables defined in the scope
parameter.Starting in MongoDB 4.4, mapReduce
no longer supports the deprecated BSON type JavaScript code with scope (BSON type 15) for its functions. The finalize
function must be either BSON type String (BSON type 2) or BSON type JavaScript (BSON type 13). To pass constant values which will be accessible in the finalize
function, use the scope
parameter.
finalize
function has been deprecated since version 4.2.1.The examples in this section include aggregation pipeline alternatives without custom aggregation expressions. For alternatives that use custom expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.
Create a sample collection orders
with these documents:
db.orders.insertMany([ { _id: 1, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-01"), price: 25, items: [ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" }, { _id: 2, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-08"), price: 70, items: [ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" }, { _id: 3, cust_id: "Busby Bee", ord_date: new Date("2020-03-08"), price: 50, items: [ { sku: "oranges", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" }, { _id: 4, cust_id: "Busby Bee", ord_date: new Date("2020-03-18"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 5, cust_id: "Busby Bee", ord_date: new Date("2020-03-19"), price: 50, items: [ { sku: "chocolates", qty: 5, price: 10 } ], status: "A"}, { _id: 6, cust_id: "Cam Elot", ord_date: new Date("2020-03-19"), price: 35, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, { _id: 7, cust_id: "Cam Elot", ord_date: new Date("2020-03-20"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 8, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 75, items: [ { sku: "chocolates", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, { _id: 9, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 55, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, { _id: 10, cust_id: "Don Quis", ord_date: new Date("2020-03-23"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" } ])
Perform the map-reduce operation on the orders
collection to group by the cust_id
, and calculate the sum of the price
for each cust_id
:
Define the map function to process each input document:
this
refers to the document that the map-reduce operation is processing.price
to the cust_id
for each document and emits the cust_id
and price
.var mapFunction1 = function() { emit(this.cust_id, this.price); };
Define the corresponding reduce function with two arguments keyCustId
and valuesPrices
:
valuesPrices
is an array whose elements are the price
values emitted by the map function and grouped by keyCustId
.valuesPrice
array to the sum of its elements.var reduceFunction1 = function(keyCustId, valuesPrices) { return Array.sum(valuesPrices); };
Perform map-reduce on all documents in the orders
collection using the mapFunction1
map function and the reduceFunction1
reduce function:
db.orders.mapReduce( mapFunction1, reduceFunction1, { out: "map_reduce_example" } )
This operation outputs the results to a collection named map_reduce_example
. If the map_reduce_example
collection already exists, the operation will replace the contents with the results of this map-reduce operation.
Query the map_reduce_example
collection to verify the results:
db.map_reduce_example.find().sort( { _id: 1 } )
The operation returns these documents:
{ "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Busby Bee", "value" : 125 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Don Quis", "value" : 155 }
Using the available aggregation pipeline operators, you can rewrite the map-reduce operation without defining custom functions:
db.orders.aggregate([ { $group: { _id: "$cust_id", value: { $sum: "$price" } } }, { $out: "agg_alternative_1" } ])
The $group
stage groups by the cust_id
and calculates the value
field (See also $sum
). The value
field contains the total price
for each cust_id
.
The stage output the following documents to the next stage:
{ "_id" : "Don Quis", "value" : 155 } { "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Busby Bee", "value" : 125 }
$out
writes the output to the collection agg_alternative_1
. Alternatively, you could use $merge
instead of $out
.Query the agg_alternative_1
collection to verify the results:
db.agg_alternative_1.find().sort( { _id: 1 } )
The operation returns the following documents:
{ "_id" : "Ant O. Knee", "value" : 95 } { "_id" : "Busby Bee", "value" : 125 } { "_id" : "Cam Elot", "value" : 60 } { "_id" : "Don Quis", "value" : 155 }
For an alternative that uses custom aggregation expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.
In the following example, you will see a map-reduce operation on the orders
collection for all documents that have an ord_date
value greater than or equal to 2020-03-01
.
The operation in the example:
item.sku
field, and calculates the number of orders and the total quantity ordered for each sku
.sku
value and merges the results into the output collection.When merging results, if an existing document has the same key as the new result, the operation overwrites the existing document. If there is no existing document with the same key, the operation inserts the document.
Example steps:
Define the map function to process each input document:
this
refers to the document that the map-reduce operation is processing.sku
with a new object value
that contains the count
of 1
and the item qty
for the order and emits the sku
(stored in the key
)
and the value
.var mapFunction2 = function() { for (var idx = 0; idx < this.items.length; idx++) { var key = this.items[idx].sku; var value = { count: 1, qty: this.items[idx].qty }; emit(key, value); } };
Define the corresponding reduce function with two arguments keySKU
and countObjVals
:
countObjVals
is an array whose elements are the objects mapped to the grouped keySKU
values passed by map function to the reducer function.countObjVals
array to a single object reducedValue
that contains the count
and the qty
fields.reducedVal
, the count
field contains the sum of the count
fields from the individual array elements, and the qty
field contains the sum of the qty
fields from the individual array elements.var reduceFunction2 = function(keySKU, countObjVals) { reducedVal = { count: 0, qty: 0 }; for (var idx = 0; idx < countObjVals.length; idx++) { reducedVal.count += countObjVals[idx].count; reducedVal.qty += countObjVals[idx].qty; } return reducedVal; };
Define a finalize function with two arguments key
and reducedVal
. The function modifies the reducedVal
object to add a computed field named avg
and returns the modified object:
var finalizeFunction2 = function (key, reducedVal) { reducedVal.avg = reducedVal.qty/reducedVal.count; return reducedVal; };
Perform the map-reduce operation on the orders
collection using the mapFunction2
, reduceFunction2
, and finalizeFunction2
functions:
db.orders.mapReduce( mapFunction2, reduceFunction2, { out: { merge: "map_reduce_example2" }, query: { ord_date: { $gte: new Date("2020-03-01") } }, finalize: finalizeFunction2 } );
This operation uses the query
field to select only those documents with ord_date
greater than or equal to new Date("2020-03-01")
. Then it outputs the results to a collection map_reduce_example2
.
If the map_reduce_example2
collection already exists, the operation will merge the existing contents with the results of this map-reduce operation. That is, if an existing document has the same key as the new result, the operation overwrites the existing document. If there is no existing document with the same key, the operation inserts the document.
Query the map_reduce_example2
collection to verify the results:
db.map_reduce_example2.find().sort( { _id: 1 } )
The operation returns these documents:
{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } }
Using the available aggregation pipeline operators, you can rewrite the map-reduce operation without defining custom functions:
db.orders.aggregate( [ { $match: { ord_date: { $gte: new Date("2020-03-01") } } }, { $unwind: "$items" }, { $group: { _id: "$items.sku", qty: { $sum: "$items.qty" }, orders_ids: { $addToSet: "$_id" } } }, { $project: { value: { count: { $size: "$orders_ids" }, qty: "$qty", avg: { $divide: [ "$qty", { $size: "$orders_ids" } ] } } } }, { $merge: { into: "agg_alternative_3", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } } ] )
$match
stage selects only those documents with ord_date
greater than or equal to new Date("2020-03-01")
.The $unwind
stage breaks down the document by the items
array field to output a document for each array element. For example:
{ "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "apples", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "oranges", "qty" : 8, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "pears", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 4, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-18T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 5, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-19T00:00:00Z"), "price" : 50, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } ...
The $group
stage groups by the items.sku
, calculating for each sku:
qty
field. The qty
field contains theqty
ordered per each items.sku
(See $sum
).orders_ids
array. The orders_ids
field contains an_id
's for the items.sku
(See $addToSet
).{ "_id" : "chocolates", "qty" : 15, "orders_ids" : [ 2, 5, 8 ] } { "_id" : "oranges", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ] } { "_id" : "carrots", "qty" : 15, "orders_ids" : [ 6, 9 ] } { "_id" : "apples", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ] } { "_id" : "pears", "qty" : 10, "orders_ids" : [ 3 ] }
$project
stage reshapes the output document to mirror the map-reduce's output to have two fields _id
and value
. The $project
sets:The $unwind
stage breaks down the document by the items
array field to output a document for each array element. For example:
{ "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-01T00:00:00Z"), "price" : 25, "items" : { "sku" : "apples", "qty" : 5, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "oranges", "qty" : 8, "price" : 2.5 }, "status" : "A" } { "_id" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 70, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 3, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-08T00:00:00Z"), "price" : 50, "items" : { "sku" : "pears", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 4, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-18T00:00:00Z"), "price" : 25, "items" : { "sku" : "oranges", "qty" : 10, "price" : 2.5 }, "status" : "A" } { "_id" : 5, "cust_id" : "Busby Bee", "ord_date" : ISODate("2020-03-19T00:00:00Z"), "price" : 50, "items" : { "sku" : "chocolates", "qty" : 5, "price" : 10 }, "status" : "A" } ...
The $group
stage groups by the items.sku
, calculating for each sku:
qty
field. The qty
field contains the total qty
ordered per each items.sku
using $sum
.orders_ids
array. The orders_ids
field contains an array of distinct order _id
's for the items.sku
using $addToSet
.{ "_id" : "chocolates", "qty" : 15, "orders_ids" : [ 2, 5, 8 ] } { "_id" : "oranges", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ] } { "_id" : "carrots", "qty" : 15, "orders_ids" : [ 6, 9 ] } { "_id" : "apples", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ] } { "_id" : "pears", "qty" : 10, "orders_ids" : [ 3 ] }
The $project
stage reshapes the output document to mirror the map-reduce's output to have two fields _id
and value
. The $project
sets:
value.count
to the size of the orders_ids
array using $size
.value.qty
to the qty
field of input document.value.avg
to the average number of qty per order using $divide
and $size
.{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } }
$merge
writes the output to the collection agg_alternative_3
. If an existing document has the same key _id
as the new result, the operation overwrites the existing document. If there is no existing document with the same key, the operation inserts the document.Query the agg_alternative_3
collection to verify the results:
db.agg_alternative_3.find().sort( { _id: 1 } )
The operation returns the following documents:
{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } } { "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } } { "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } } { "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } } { "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } }
For an alternative that uses custom aggregation expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.
The output of the db.collection.mapReduce()
method is identical to that of the mapReduce
command. See the Output section of the mapReduce
command for information on the db.collection.mapReduce()
output.
MongoDB drivers automatically set afterClusterTime for operations associated with causally consistent sessions. Starting in MongoDB 4.2, the db.collection.mapReduce()
no longer support afterClusterTime. As such, db.collection.mapReduce()
cannot be associatd with causally consistent sessions.