/*
 * Copyright 2008-present MongoDB, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.mongodb;

import com.mongodb.client.model.Collation;
import com.mongodb.lang.Nullable;

import java.util.Map;
import java.util.concurrent.TimeUnit;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

This class groups the argument for a map/reduce operation and can build the underlying command object
@mongodb.driver.manualapplications/map-reduce Map-Reduce
/** * This class groups the argument for a map/reduce operation and can build the underlying command object * * @mongodb.driver.manual applications/map-reduce Map-Reduce */
public class MapReduceCommand { private final String mapReduce; private final String map; private final String reduce; private String finalize; private ReadPreference readPreference; private final OutputType outputType; private final String outputCollection; private String outputDB; private final DBObject query; private DBObject sort; private int limit; private long maxTimeMS; private Map<String, Object> scope; private Boolean jsMode; private Boolean verbose; private Boolean bypassDocumentValidation; private Collation collation;
Represents the command for a map reduce operation Runs the command in REPLACE output type to a named collection
Params:
  • inputCollection – collection to use as the source documents to perform the map reduce operation.
  • map – a JavaScript function that associates or "maps" a value with a key and emits the key and value pair.
  • reduce – a JavaScript function that "reduces" to a single object all the values associated with a particular key.
  • outputCollection – optional - leave null if want to get the result inline
  • type – the type of output
  • query – specifies the selection criteria using query operators for determining the documents input to the map function.
@mongodb.driver.manualreference/command/mapReduce/ Map Reduce Command
/** * Represents the command for a map reduce operation Runs the command in REPLACE output type to a named collection * * @param inputCollection collection to use as the source documents to perform the map reduce operation. * @param map a JavaScript function that associates or "maps" a value with a key and emits the key and value pair. * @param reduce a JavaScript function that "reduces" to a single object all the values associated with a particular key. * @param outputCollection optional - leave null if want to get the result inline * @param type the type of output * @param query specifies the selection criteria using query operators for determining the documents input to the map * function. * @mongodb.driver.manual reference/command/mapReduce/ Map Reduce Command */
public MapReduceCommand(final DBCollection inputCollection, final String map, final String reduce, @Nullable final String outputCollection, final OutputType type, final DBObject query) { this.mapReduce = inputCollection.getName(); this.map = map; this.reduce = reduce; this.outputCollection = outputCollection; this.outputType = type; this.query = query; this.outputDB = null; this.verbose = true; }
Sets the verbosity of the MapReduce job, defaults to 'true'
Params:
  • verbose – The verbosity level.
/** * Sets the verbosity of the MapReduce job, defaults to 'true' * * @param verbose The verbosity level. */
public void setVerbose(final Boolean verbose) { this.verbose = verbose; }
Gets the verbosity of the MapReduce job.
Returns:the verbosity level.
/** * Gets the verbosity of the MapReduce job. * * @return the verbosity level. */
public Boolean isVerbose() { return verbose; }
Get the name of the collection the MapReduce will read from
Returns:name of the collection the MapReduce will read from
/** * Get the name of the collection the MapReduce will read from * * @return name of the collection the MapReduce will read from */
public String getInput() { return mapReduce; }
Get the map function, as a JS String
Returns:the map function (as a JS String)
/** * Get the map function, as a JS String * * @return the map function (as a JS String) */
public String getMap() { return map; }
Gets the reduce function, as a JS String
Returns:the reduce function (as a JS String)
/** * Gets the reduce function, as a JS String * * @return the reduce function (as a JS String) */
public String getReduce() { return reduce; }
Gets the output target (name of collection to save to) This value is nullable only if OutputType is set to INLINE
Returns:The outputCollection
/** * Gets the output target (name of collection to save to) This value is nullable only if OutputType is set to INLINE * * @return The outputCollection */
@Nullable public String getOutputTarget() { return outputCollection; }
Gets the OutputType for this instance.
Returns:The outputType.
/** * Gets the OutputType for this instance. * * @return The outputType. */
public OutputType getOutputType() { return outputType; }
Gets the Finalize JS Function
Returns:The finalize function (as a JS String).
/** * Gets the Finalize JS Function * * @return The finalize function (as a JS String). */
@Nullable public String getFinalize() { return finalize; }
Sets the Finalize JS Function
Params:
  • finalize – The finalize function (as a JS String)
/** * Sets the Finalize JS Function * * @param finalize The finalize function (as a JS String) */
public void setFinalize(@Nullable final String finalize) { this.finalize = finalize; }
Gets the query to run for this MapReduce job
Returns:The query object
/** * Gets the query to run for this MapReduce job * * @return The query object */
@Nullable public DBObject getQuery() { return query; }
Gets the (optional) sort specification object
Returns:the Sort DBObject
/** * Gets the (optional) sort specification object * * @return the Sort DBObject */
@Nullable public DBObject getSort() { return sort; }
Sets the (optional) sort specification object
Params:
  • sort – The sort specification object
/** * Sets the (optional) sort specification object * * @param sort The sort specification object */
public void setSort(@Nullable final DBObject sort) { this.sort = sort; }
Gets the (optional) limit on input
Returns:The limit specification object
/** * Gets the (optional) limit on input * * @return The limit specification object */
public int getLimit() { return limit; }
Sets the (optional) limit on input
Params:
  • limit – The limit specification object
/** * Sets the (optional) limit on input * * @param limit The limit specification object */
public void setLimit(final int limit) { this.limit = limit; }
Gets the max execution time for this command, in the given time unit.
Params:
  • timeUnit – the time unit to return the value in.
Returns:the maximum execution time
@mongodb.server.release2.6
Since:2.12.0
/** * Gets the max execution time for this command, in the given time unit. * * @param timeUnit the time unit to return the value in. * @return the maximum execution time * @mongodb.server.release 2.6 * @since 2.12.0 */
public long getMaxTime(final TimeUnit timeUnit) { return timeUnit.convert(maxTimeMS, MILLISECONDS); }
Sets the max execution time for this command, in the given time unit.
Params:
  • maxTime – the maximum execution time. A non-zero value requires a server version >= 2.6
  • timeUnit – the time unit that maxTime is specified in
@mongodb.server.release2.6
Since:2.12.0
/** * Sets the max execution time for this command, in the given time unit. * * @param maxTime the maximum execution time. A non-zero value requires a server version &gt;= 2.6 * @param timeUnit the time unit that maxTime is specified in * @mongodb.server.release 2.6 * @since 2.12.0 */
public void setMaxTime(final long maxTime, final TimeUnit timeUnit) { this.maxTimeMS = MILLISECONDS.convert(maxTime, timeUnit); }
Gets the (optional) JavaScript scope
Returns:The JavaScript scope
/** * Gets the (optional) JavaScript scope * * @return The JavaScript scope */
@Nullable public Map<String, Object> getScope() { return scope; }
Sets the (optional) JavaScript scope
Params:
  • scope – The JavaScript scope
/** * Sets the (optional) JavaScript scope * * @param scope The JavaScript scope */
public void setScope(@Nullable final Map<String, Object> scope) { this.scope = scope; }
Gets the (optional) JavaScript mode
Returns:The JavaScript mode
Since:2.13
/** * Gets the (optional) JavaScript mode * * @return The JavaScript mode * @since 2.13 */
@Nullable public Boolean getJsMode() { return jsMode; }
Sets the (optional) JavaScript Mode
Params:
  • jsMode – Specifies whether to convert intermediate data into BSON format between the execution of the map and reduce functions
Since:2.13
/** * Sets the (optional) JavaScript Mode * * @param jsMode Specifies whether to convert intermediate data into BSON format between the execution of the map and reduce functions * @since 2.13 */
public void setJsMode(final @Nullable Boolean jsMode) { this.jsMode = jsMode; }
Gets the (optional) database name where the output collection should reside
Returns:the name of the database the result is stored in, or null.
/** * Gets the (optional) database name where the output collection should reside * * @return the name of the database the result is stored in, or null. */
@Nullable public String getOutputDB() { return this.outputDB; }
Sets the (optional) database name where the output collection should reside
Params:
  • outputDB – the name of the database to send the Map Reduce output to
/** * Sets the (optional) database name where the output collection should reside * * @param outputDB the name of the database to send the Map Reduce output to */
public void setOutputDB(@Nullable final String outputDB) { this.outputDB = outputDB; }
Gets whether to bypass document validation, or null if unspecified. The default is null.
Returns:whether to bypass document validation, or null if unspecified.
Since:2.14
@mongodb.server.release3.2
/** * Gets whether to bypass document validation, or null if unspecified. The default is null. * * @return whether to bypass document validation, or null if unspecified. * @since 2.14 * @mongodb.server.release 3.2 */
@Nullable public Boolean getBypassDocumentValidation() { return bypassDocumentValidation; }
Sets whether to bypass document validation.
Params:
  • bypassDocumentValidation – whether to bypass document validation, or null if unspecified
Since:2.14
@mongodb.server.release3.2
/** * Sets whether to bypass document validation. * * @param bypassDocumentValidation whether to bypass document validation, or null if unspecified * @since 2.14 * @mongodb.server.release 3.2 */
public void setBypassDocumentValidation(@Nullable final Boolean bypassDocumentValidation) { this.bypassDocumentValidation = bypassDocumentValidation; }
Turns this command into a DBObject representation of this map reduce command.
Returns:a DBObject that contains the MongoDB document representation of this command.
/** * Turns this command into a DBObject representation of this map reduce command. * * @return a DBObject that contains the MongoDB document representation of this command. */
public DBObject toDBObject() { BasicDBObject cmd = new BasicDBObject(); cmd.put("mapreduce", mapReduce); cmd.put("map", map); cmd.put("reduce", reduce); if (verbose != null) { cmd.put("verbose", verbose); } BasicDBObject out = new BasicDBObject(); switch (outputType) { case INLINE: out.put("inline", 1); break; case REPLACE: out.put("replace", outputCollection); break; case MERGE: out.put("merge", outputCollection); break; case REDUCE: out.put("reduce", outputCollection); break; default: throw new IllegalArgumentException("Unexpected output type"); } if (outputDB != null) { out.put("db", outputDB); } cmd.put("out", out); if (query != null) { cmd.put("query", query); } if (finalize != null) { cmd.put("finalize", finalize); } if (sort != null) { cmd.put("sort", sort); } if (limit > 0) { cmd.put("limit", limit); } if (scope != null) { cmd.put("scope", scope); } if (jsMode != null) { cmd.put("jsMode", jsMode); } if (maxTimeMS != 0) { cmd.put("maxTimeMS", maxTimeMS); } return cmd; }
Sets the read preference for this command. See the * documentation for ReadPreference for more information.
Params:
  • preference – Read Preference to use
/** * Sets the read preference for this command. See the * documentation for {@link ReadPreference} for more information. * * @param preference Read Preference to use */
public void setReadPreference(@Nullable final ReadPreference preference) { this.readPreference = preference; }
Gets the read preference
Returns:the readPreference
/** * Gets the read preference * * @return the readPreference */
@Nullable public ReadPreference getReadPreference() { return readPreference; }
Returns the collation
Returns:the collation
Since:3.4
@mongodb.server.release3.4
/** * Returns the collation * * @return the collation * @since 3.4 * @mongodb.server.release 3.4 */
@Nullable public Collation getCollation() { return collation; }
Sets the collation options
Params:
  • collation – the collation options
Since:3.4
@mongodb.server.release3.4
/** * Sets the collation options * * @param collation the collation options * @since 3.4 * @mongodb.server.release 3.4 */
@Nullable public void setCollation(final Collation collation) { this.collation = collation; } @Override public String toString() { return toDBObject().toString(); } String getOutputTargetNonNull() { if (outputCollection == null) { throw new MongoInternalException("outputCollection can not be null in this context"); } return outputCollection; }
Represents the different options available for outputting the results of a map-reduce operation.
@mongodb.driver.manualreference/command/mapReduce/#mapreduce-out-cmd Output options
/** * Represents the different options available for outputting the results of a map-reduce operation. * * @mongodb.driver.manual reference/command/mapReduce/#mapreduce-out-cmd Output options */
public enum OutputType {
Save the job output to a collection, replacing its previous content
/** * Save the job output to a collection, replacing its previous content */
REPLACE,
Merge the job output with the existing contents of outputTarget collection
/** * Merge the job output with the existing contents of outputTarget collection */
MERGE,
Reduce the job output with the existing contents of outputTarget collection
/** * Reduce the job output with the existing contents of outputTarget collection */
REDUCE,
Return results inline, no result is written to the DB server
/** * Return results inline, no result is written to the DB server */
INLINE } }