From 15ee3b59f8aac979df04799fc8e117af943d9fce Mon Sep 17 00:00:00 2001 From: Ayush Gupta Date: Tue, 24 Oct 2017 08:57:49 +0530 Subject: [PATCH 1/4] addFields operator and tests added --- lib/aggregate.js | 35 +++++++++++++++++++++++++++++++++++ package-lock.json | 36 ++++++++++++++++++------------------ test/aggregate.test.js | 14 ++++++++++++++ 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/lib/aggregate.js b/lib/aggregate.js index 9d0d00f66e5..c98ff13aacb 100644 --- a/lib/aggregate.js +++ b/lib/aggregate.js @@ -106,6 +106,41 @@ Aggregate.prototype.append = function() { return this; }; +/** + * Appends a new $addFields operator to this aggregate pipeline. + * Requires MongoDB v3.4+ to work + * + * ####Examples: + * + * // adding new fields based on existing fields + * aggregate.addFields({ + * newField: '$b.nested' + * , plusTen: { $add: ['$val', 10]} + * , sub: { + * name: '$a' + * } + * }) + * + * // etc + * aggregate.addFields({ salary_k: { $divide: [ "$salary", 1000 ] } }); + * + * @param {Object} arg field specification + * @see projection http://docs.mongodb.org/manual/reference/aggregation/project/ + * @return {Aggregate} + * @api public + */ +Aggregate.prototype.addFields = function(arg) { + var fields = {}; + if (typeof arg === 'object' && !util.isArray(arg)) { + Object.keys(arg).forEach(function(field) { + fields[field] = arg[field]; + }); + } else { + throw new Error('Invalid addFields() argument. Must be an object'); + } + return this.append({$addFields: fields}); +}; + /** * Appends a new $project operator to this aggregate pipeline. * diff --git a/package-lock.json b/package-lock.json index 2a439c4b0b0..ace1960d1db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mongoose", - "version": "4.12.4-pre", + "version": "4.12.5-pre", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2866,15 +2866,6 @@ "is-finite": "1.0.2" } }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" - } - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -2893,6 +2884,15 @@ } } }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, "requirejs": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", @@ -3097,14 +3097,6 @@ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3116,6 +3108,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringifier": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", diff --git a/test/aggregate.test.js b/test/aggregate.test.js index 2af32acb83c..c6aad586408 100644 --- a/test/aggregate.test.js +++ b/test/aggregate.test.js @@ -448,6 +448,20 @@ describe('aggregate: ', function() { }); }); + describe('project', function() { + it('(object)', function(done) { + var aggregate = new Aggregate(); + + assert.equal(aggregate.addFields({ a: 1, b: 1, c: 0 }), aggregate); + assert.deepEqual(aggregate._pipeline, [{ $addFields: { a: 1, b: 1, c: 0 } }]); + + aggregate.addFields({ d: {$add: ['$a','$b']} }); + assert.deepEqual(aggregate._pipeline, [{ $addFields: { a: 1, b: 1, c: 0 } }, { $addFields: { d: {$add: ['$a','$b']} } }]); + + done(); + }); + }); + describe('facet', function() { it('works', function(done) { var aggregate = new Aggregate(); From 45b749a526cfaf6309c6196a2dfcba1baf721822 Mon Sep 17 00:00:00 2001 From: Ayush Gupta Date: Tue, 24 Oct 2017 09:02:43 +0530 Subject: [PATCH 2/4] fix test name --- test/aggregate.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/aggregate.test.js b/test/aggregate.test.js index c6aad586408..a5b3806762f 100644 --- a/test/aggregate.test.js +++ b/test/aggregate.test.js @@ -448,7 +448,7 @@ describe('aggregate: ', function() { }); }); - describe('project', function() { + describe('addFields', function() { it('(object)', function(done) { var aggregate = new Aggregate(); From 273f489bf3c804ad8bea150a1f3da2849d0464c0 Mon Sep 17 00:00:00 2001 From: Ayush Gupta Date: Tue, 24 Oct 2017 09:04:56 +0530 Subject: [PATCH 3/4] (docs) fix addFields link --- lib/aggregate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aggregate.js b/lib/aggregate.js index c98ff13aacb..7927cb21aa4 100644 --- a/lib/aggregate.js +++ b/lib/aggregate.js @@ -125,7 +125,7 @@ Aggregate.prototype.append = function() { * aggregate.addFields({ salary_k: { $divide: [ "$salary", 1000 ] } }); * * @param {Object} arg field specification - * @see projection http://docs.mongodb.org/manual/reference/aggregation/project/ + * @see $addFields https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/ * @return {Aggregate} * @api public */ From 541fb36a699edb079cc1ff5f091943eb2bef2cc6 Mon Sep 17 00:00:00 2001 From: Ayush Gupta Date: Tue, 24 Oct 2017 09:13:34 +0530 Subject: [PATCH 4/4] (lint): fix trailing spaces --- test/aggregate.test.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/aggregate.test.js b/test/aggregate.test.js index a5b3806762f..57bc2fdcda8 100644 --- a/test/aggregate.test.js +++ b/test/aggregate.test.js @@ -451,13 +451,12 @@ describe('aggregate: ', function() { describe('addFields', function() { it('(object)', function(done) { var aggregate = new Aggregate(); - + assert.equal(aggregate.addFields({ a: 1, b: 1, c: 0 }), aggregate); assert.deepEqual(aggregate._pipeline, [{ $addFields: { a: 1, b: 1, c: 0 } }]); - + aggregate.addFields({ d: {$add: ['$a','$b']} }); assert.deepEqual(aggregate._pipeline, [{ $addFields: { a: 1, b: 1, c: 0 } }, { $addFields: { d: {$add: ['$a','$b']} } }]); - done(); }); });