summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression.cpp
diff options
context:
space:
mode:
authorBenjamin Murphy <benjamin_murphy@me.com>2016-04-11 16:56:59 -0400
committerBenjamin Murphy <benjamin_murphy@me.com>2016-04-21 11:38:43 -0400
commit223c2a1aa5fd11fd3e7115ca9acb6d1217f80f92 (patch)
tree7c34cfa98f2b2324862405d9c14e6fdc57aef2de /src/mongo/db/pipeline/expression.cpp
parent75f24a26015566ce5458887de1431d2458ff7fd3 (diff)
downloadmongo-223c2a1aa5fd11fd3e7115ca9acb6d1217f80f92.tar.gz
SERVER-6146 Aggregation now supports the in expression.
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r--src/mongo/db/pipeline/expression.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp
index 9eb2497cd27..465c98aa450 100644
--- a/src/mongo/db/pipeline/expression.cpp
+++ b/src/mongo/db/pipeline/expression.cpp
@@ -2095,6 +2095,29 @@ const char* ExpressionIfNull::getOpName() const {
return "$ifNull";
}
+/* ----------------------- ExpressionIn ---------------------------- */
+
+Value ExpressionIn::evaluateInternal(Variables* vars) const {
+ Value argument(vpOperand[0]->evaluateInternal(vars));
+ Value arrayOfValues(vpOperand[1]->evaluateInternal(vars));
+
+ uassert(40081,
+ str::stream() << "$in requires an array as a second argument, found: "
+ << typeName(arrayOfValues.getType()),
+ arrayOfValues.isArray());
+ for (auto&& value : arrayOfValues.getArray()) {
+ if (argument == value) {
+ return Value(true);
+ }
+ }
+ return Value(false);
+}
+
+REGISTER_EXPRESSION(in, ExpressionIn::parse);
+const char* ExpressionIn::getOpName() const {
+ return "$in";
+}
+
/* ----------------------- ExpressionLn ---------------------------- */
Value ExpressionLn::evaluateNumericArg(const Value& numericArg) const {