summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression.cpp
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2013-09-09 13:20:20 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2013-09-09 14:04:00 -0400
commitabb240549a0174f52d1ee18a8866e0ad65a10881 (patch)
treed82830e74a50237fa9993fdb845538b6952fa9e0 /src/mongo/db/pipeline/expression.cpp
parentf1e09016d390badbfd9d1c75ed7683c12fb45c10 (diff)
downloadmongo-abb240549a0174f52d1ee18a8866e0ad65a10881.tar.gz
SERVER-4899 $size for aggregation
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r--src/mongo/db/pipeline/expression.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp
index 5a3d01397b9..edd418d8102 100644
--- a/src/mongo/db/pipeline/expression.cpp
+++ b/src/mongo/db/pipeline/expression.cpp
@@ -2350,6 +2350,22 @@ namespace {
return "$setUnion";
}
+ /* ----------------------- ExpressionSize ---------------------------- */
+
+ Value ExpressionSize::evaluateInternal(const Variables& vars) const {
+ Value array = vpOperand[0]->evaluateInternal(vars);
+
+ uassert(17124, str::stream() << "The argument to $size must be an Array, but was of type: "
+ << typeName(array.getType()),
+ array.getType() == Array);
+ return Value::createIntOrLong(array.getArray().size());
+ }
+
+ REGISTER_EXPRESSION("$size", ExpressionSize::parse);
+ const char *ExpressionSize::getOpName() const {
+ return "$size";
+ }
+
/* ----------------------- ExpressionStrcasecmp ---------------------------- */
Value ExpressionStrcasecmp::evaluateInternal(const Variables& vars) const {