diff options
author | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-05-28 14:36:42 -0400 |
---|---|---|
committer | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-06-15 13:29:53 -0400 |
commit | 5717454bc3c50c9ac985dcb77639f2710dfda8e4 (patch) | |
tree | ecf84f9be86e8346c732d8b613ebe7270ad7b941 /src/mongo/db/pipeline/expression.cpp | |
parent | ba6a3b8e5075f8dec1c8d3dadee6c91b7c7dc112 (diff) | |
download | mongo-5717454bc3c50c9ac985dcb77639f2710dfda8e4.tar.gz |
SERVER-14872: Aggregation expression to concatenate multiple arrays into one
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index f409bf107bb..8c266d22158 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -748,6 +748,33 @@ namespace { return "$concat"; } + /* ------------------------- ExpressionConcatArrays ----------------------------- */ + + Value ExpressionConcatArrays::evaluateInternal(Variables* vars) const { + const size_t n = vpOperand.size(); + vector<Value> values; + + for (size_t i = 0; i < n; ++i) { + Value val = vpOperand[i]->evaluateInternal(vars); + if (val.nullish()) { + return Value(BSONNULL); + } + + uassert(28664, str::stream() << "$concatArrays only supports arrays, not " + << typeName(val.getType()), + val.getType() == Array); + + const auto& subValues = val.getArray(); + values.insert(values.end(), subValues.begin(), subValues.end()); + } + return Value(std::move(values)); + } + + REGISTER_EXPRESSION("$concatArrays", ExpressionConcatArrays::parse); + const char* ExpressionConcatArrays::getOpName() const { + return "$concatArrays"; + } + /* ----------------------- ExpressionCond ------------------------------ */ Value ExpressionCond::evaluateInternal(Variables* vars) const { |