// SERVER-17943: Add $filter aggregation expression. // For assertErrorCode. load('jstests/aggregation/extras/utils.js'); (function() { 'use strict'; var coll = db.agg_filter_expr; coll.drop(); assert.writeOK(coll.insert({_id: 0, a: [1,2,3,4,5]})); assert.writeOK(coll.insert({_id: 1, a: [2,4]})); assert.writeOK(coll.insert({_id: 2, a: []})); assert.writeOK(coll.insert({_id: 3, a: [1]})); assert.writeOK(coll.insert({_id: 4, a: null})); assert.writeOK(coll.insert({_id: 5, a: undefined})); assert.writeOK(coll.insert({_id: 6})); // Create filter to only accept odd numbers. filterDoc = {input: '$a', as: 'x', cond: {$eq: [1, {$mod: ['$$x', 2]}]}}; var expectedResults = [ {_id: 0, b: [1,3,5]}, {_id: 1, b: []}, {_id: 2, b: []}, {_id: 3, b: [1]}, {_id: 4, b: null}, {_id: 5, b: null}, {_id: 6, b: null}, ]; var results = coll.aggregate([{$project: {b: {$filter: filterDoc}}}]).toArray(); assert.eq(results, expectedResults); // Invalid filter expressions. // Insert a document so that the initial cursor doesn't immediately return EOF. coll.insert({_id: 0, a: [1, 2]}); // '$filter' is not a document. var filterDoc = 'string'; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28646); // Extra field(s). filterDoc = {input: '$a', as: 'x', cond: true, extra: 1}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28647); // Missing 'input'. filterDoc = {as: 'x', cond: true}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28648); // Missing 'as'. filterDoc = {input: '$a', cond: true}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28649); // Missing 'cond'. filterDoc = {input: '$a', as: 'x'}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28650); // 'as' is not a valid variable name. filterDoc = {input: '$a', as: '$x', cond: true}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 16867); // 'input' is not an array. filterDoc = {input: 'string', as: 'x', cond: true}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28651); coll.drop(); assert.writeOK(coll.insert({a: 'string'})); filterDoc = {input: '$a', as: 'x', cond: true}; assertErrorCode(coll, [{$project: {b: {$filter: filterDoc}}}], 28651); }());