Comparing version 0.9.1 to 1.0.0
Changelog | ||
========= | ||
Changes starting from v0.5.0 are tracked here | ||
## v1.0.0 / 2017-02-28 | ||
- Added array aggregation operators | ||
(`$arrayElemAt`,`$concatArrays`,`$filter`,`$indexOfArray`,`$isArray`,`$range`,`$reverseArray`,`$reduce`,`$slice`,`$zip`) | ||
- Added string aggregation operators (`$indexOfBytes`,`$split`) | ||
- Added arithmetic aggregation operators (`$ceil`,`$exp`,`$floor`,`$ln`,`$log`,`$log10`,`$pow`,`$sqrt`,`$trunc`) | ||
- Added .editorconfig | ||
- Pass utility functions to custom operator implementation | ||
- Rename function to retrieve collection id to `idKey` in custom operators | ||
- Moved support for query porjection streaming to a new package [mingo-stream](https://github.com/kofrasa/mingo-stream) | ||
@@ -6,0 +14,0 @@ ## v0.9.1 / 2017-02-08 |
@@ -1,2 +0,2 @@ | ||
!function(n,r){"use strict";function t(n,r){if(w(n))throw new Error(r)}function e(n,r){if(w(n))throw new TypeError(r)}function u(n){return t(!y(n))}function i(n,r){e(n===Object(n),r)}function o(n,r){return Object.prototype.toString.call(n)==="[object "+r+"]"}function a(n){return o(n,"Boolean")}function c(n){return o(n,"String")}function l(n){return o(n,"Number")}function f(n){return o(n,"Array")}function s(n){return o(n,"Object")}function h(n){return n===Object(n)}function p(n){return o(n,"Date")}function d(n,r){return o(n,"RegExp")}function v(n,r){return o(n,"Function")}function g(n){return o(n,"Null")}function y(n){return o(n,"Undefined")}function $(n,r){return!n.includes(r)}function b(n,r){return n.includes(r)}function m(n){return!!n}function w(n){return!n}function O(n){return["undefined","null"].includes(typeof n)||f(n)&&0===n.length||s(n)&&0===Object.keys(n).length||!n}function j(n){return f(n)?n:[n]}function E(n){return Object.prototype.toString.call(n).match(/\s(\w+)/)[1].toLowerCase()}function _(n,r){return Object.prototype.hasOwnProperty.call(n,r)}function k(n,r,t){if(i(n,"Cannot iterate over object of type '"+E(n)+"'"),f(n))n.forEach(r,t);else for(var e in n)_(n,e)&&r.call(t,n[e],e)}function x(n,r,t){if(f(n))return n.map(r,t);if(s(n)){for(var e,u={},i=Object.keys(n),o=0,a=i.length;a>o;o++)e=i[o],u[e]=r.call(t,n[e],e);return u}throw new TypeError("Input must be an Array or Object type")}function I(n,r){return n.filter(b.bind(null,r))}function S(n,r){var t=[];return tn.apply(t,n),tn.apply(t,r.filter($.bind(null,n))),t}function A(n,r){e(f(n),"Input must be an Array");var t=[],u=function(n,r){for(var e=0,i=n.length;i>e;e++)f(n[e])&&(r>0||0>r)?u(n[e],Math.max(-1,r-1)):tn.call(t,n[e])};return u(n,r||-1),t}function M(n,r){if(n===r)return!0;var t=E(n);if(t!==E(r))return!1;if("number"===t&&isNaN(n)&&isNaN(r))return!0;if(["date","regexp"].includes(t))return n.toString()===r.toString();if("array"===t){if(n.length===r.length&&0===n.length)return!0;if(n.length!==r.length)return!1;for(var e=0,u=n.length;u>e;e++)if(!M(n[e],r[e]))return!1}else{if(![n,r].every(s))return!1;var i=Object.keys(n),o=Object.keys(r);if(i.length!==o.length)return!1;if(i.sort(),o.sort(),!M(i,o))return!1;for(var e=0,a=i.length;a>e;e++){var c=i[e];if(!M(n[c],r[c]))return!1}}return!0}function q(n){var r={},t=[];return n.forEach(function(n){var e=V(n);_(r,e)||(t.push(n),r[e]=0)}),t}function C(n,r,t){t=t||{},t.root=t.root||U(n);var e=K(n,r,null,t);return In.includes(e)?kn[e](n,r,t):e}function N(n,r){return n[r]}function T(n,r,t){for(var e=r.split("."),u=n,i=0;i<e.length;i++){var o=g(e[i].match(/^\d+$/));if(o&&f(u)){if(t===!0&&0===i)return u;u=u.map(function(n){return T(n,e[i],!0)}),1===u.length&&(u=u[0])}else u=N(u,e[i]),t=!1;if(y(u))break}return u}function D(n,e){if(!y(n)){var i,o=e.split("."),a=o[0],c=1===o.length||o.slice(1).join("."),l=null!==a.match(/^\d+$/);try{if(1===o.length)if(f(n))l?(i=N(n,a),u(i),i=[i]):(i=[],n.forEach(function(n){var r=D(n,e);y(r)||i.push(r)}),t(i.length>0));else{var s=N(n,a);u(s),i={},i[a]=s}else if(f(n))l?(i=N(n,a),i=D(i,c),u(i),i=[i]):(i=[],n.forEach(function(n){var r=D(n,e);y(r)||i.push(r)}),t(i.length>0));else{var s=N(n,a);s=D(s,c),u(s),i={},i[a]=s}}catch(h){i=r}return i}}function Q(n,r,t,e){var u=r.split("."),i=u[0],o=1===u.length||u.slice(1).join("."),a=/^\d+$/.test(i);if(1===u.length)t(n,i);else if(f(n)&&!a)n.forEach(function(n){Q(n,r,t,e)});else{if(e===!0){var c=_(n,i);(!c||y(n[i])||g(n[i]))&&(n[i]={})}Q(n[i],o,t,e)}}function R(n,r,t){Q(n,r,function(n,r){n[r]=t})}function P(n,r){Q(n,r,function(n,r){f(n)&&/^\d+$/.test(r)?n.splice(parseInt(r),1):s(n)&&delete n[r]})}function U(n){switch(E(n)){case"array":return n.map(function(n){return U(n)});case"object":return x(n,function(n,r){return U(n)});default:return n}}function F(n){for(var r=0;r<Dn.length;r++)if(Dn[r](n))return!0;return!1}function Y(n){return F(n)||!h(n)}function B(n){if(Y(n))return d(n)?{$regex:n}:{$eq:n};if(h(n)){var r=Object.keys(n),t=0===I(L(Sn),r).length;if(t)return{$eq:n};if(r.includes("$regex")){var e=n.$regex,u=n.$options||"",i="";c(e)&&(i+=e.ignoreCase||u.indexOf("i")>=0?"i":"",i+=e.multiline||u.indexOf("m")>=0?"m":"",i+=e.global||u.indexOf("g")>=0?"g":"",e=new RegExp(e,i)),n.$regex=e,delete n.$options}}return n}function J(n,r){return new Array(Math.max(r-String(n).length+1,0)).join("0")+n}function L(n){return Object.keys(Nn[n])}function z(n,r,e){for(var u,i,o,a={},c=[],l=n.length,f=0;l>f;f++)i=n[f],u=r.call(e,i,f),o=V(i),_(a,o)||(a[o]=[u,f]),c.push(U(i));return c.sort(function(n,r){var t=a[V(n)],e=a[V(r)];return t[0]<e[0]?-1:t[0]>e[0]?1:t[1]<e[1]?-1:t[1]>e[1]?1:0}),t(c.length===n.length,"sortBy must retain collection length"),c}function G(n,r,e){var u={keys:[],groups:[]},i={};return n.forEach(function(n){var t=r.call(e,n),o=V(t),a=-1;y(i[o])&&(a=u.keys.length,i[o]=a,u.keys.push(t),u.groups.push([])),a=i[o],u.groups[a].push(n)}),t(u.keys.length===u.groups.length,"Cardinality must be equal for groups and keys"),u}function H(n){return JSON.stringify({"":n})+E(n)+n}function V(n){var r,t,e,u=0,i=H(n);if(0===i.length)return u;for(r=0,e=i.length;e>r;r++)t=i.charCodeAt(r),u=(u<<5)-u+t,u|=0;return u.toString()}function W(n,t,e){if(L(An).includes(t))return pn[t](n,e);if(s(e)){var u={};for(var i in e)if(_(e,i)&&(u[i]=W(n,i,e[i]),L(An).includes(i))){if(u=u[i],Object.keys(e).length>1)throw new Error("Invalid $group expression '"+JSON.stringify(e)+"'");break}return u}return r}function K(n,r,u,i){if(i=i||{},i.root=i.root||U(n),L(Mn).includes(u))return En[u](n,r,i);if(L(An).includes(u))return n=K(n,r,null,i),e(f(n),"Must use collection type with "+u+" operator"),pn[u](n,null,i);if(c(r)&&r.length>0&&"$"===r[0]){if(xn.includes(r))return _n[r](n,null,i);if(In.includes(r))return r;var o=xn.filter(function(n){return 0===r.indexOf(n+".")});return 1===o.length&&(o=o[0],"$$ROOT"===o&&(n=i.root),r=r.substr(o.length)),T(n,r.slice(1))}switch(E(r)){case"array":return r.map(function(r){return K(n,r,null)});case"object":var a={};for(var l in r)if(_(r,l)&&(a[l]=K(n,r[l],l,i),L(Mn).includes(l))){t(1===Object.keys(r).length,"Invalid aggregation expression '"+JSON.stringify(r)+"'"),a=a[l];break}return a;default:return U(r)}}function X(n){var r=n.dataset.reduce(function(n,r){return n+r},0),t=n.dataset.length||1,e=n.sampled===!0?1:0,u=r/(t-e);return Math.sqrt(n.dataset.reduce(function(n,r){return n+Math.pow(r-u,2)},0)/t)}var Z,nn={};nn.VERSION="0.9.1",null!==n&&(Z=n.Mingo),nn.noConflict=function(){return n.Mingo=Z,nn};var rn=r!==module&&"undefined"!=typeof require;rn?module!==r&&(module.exports=nn):n.Mingo=nn;var tn=Array.prototype.push,en=Array.prototype.slice;!function(){Function.prototype.bind||(Function.prototype.bind=function(n){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var r=en.call(arguments,1),t=this,e=function(){},u=function(){return t.apply(this instanceof e?this:n,r.concat(en.call(arguments)))};return this.prototype&&(e.prototype=this.prototype),u.prototype=new e,u}),Array.prototype.includes||(Array.prototype.includes=function(n){if(null===this)throw new TypeError("Array.prototype.includes called on null or undefined");var r=Object(this),t=parseInt(r.length,10)||0;if(0===t)return!1;var e,u=parseInt(arguments[1],10)||0;u>=0?e=u:(e=t+u,0>e&&(e=0));for(var i;t>e;){if(i=r[e],n===i||n!==n&&i!==i)return!0;e++}return!1}),Array.prototype.find||(Array.prototype.find=function(n){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if(!v(n))throw new TypeError("predicate must be a function");for(var t,e=Object(this),u=e.length>>>0,i=arguments[1],o=0;u>o;o++)if(t=e[o],n.call(i,t,o,e))return t;return r}),Array.prototype.findIndex||Object.defineProperty(Array.prototype,"findIndex",{value:function(n){if(null==this)throw new TypeError("Array.prototype.findIndex called on null or undefined");if("function"!=typeof n)throw new TypeError("predicate must be a function");for(var r,t=Object(this),e=t.length>>>0,u=arguments[1],i=0;e>i;i++)if(r=t[i],n.call(u,r,i,t))return i;return-1},enumerable:!1,configurable:!1,writable:!1}),Object.keys||(Object.keys=function(n){i(n,"Object.keys called on a non-object");var r=[];for(var t in n)_(n,t)&&r.push(t);return r}),Object.values||(Object.values=function(n){i(n,"Object.values called on a non-object");var r=[];for(var t in n)_(n,t)&&r.push(n[t]);return r}),Object.assign||(Object.assign=function(n){if(g(n)||y(n))throw new TypeError("Cannot convert undefined or null to object");for(var r=Object(n),t=1;t<arguments.length;t++){var e=arguments[t];if(!y(e)&&!g(e))for(var u in e)_(e,u)&&(r[u]=e[u])}return r})}();var un={key:"_id"};if(nn._internal=function(){return{assert:t.bind(null),each:k.bind(null),falsey:w.bind(null),flatten:A.bind(null),groupBy:G.bind(null),has:_.bind(null),inArray:b.bind(null),intersection:I.bind(null),isArray:f.bind(null),isBoolean:a.bind(null),isDate:p.bind(null),isEmpty:O.bind(null),isEqual:M.bind(null),isFunction:v.bind(null),isNull:g.bind(null),isNumber:l.bind(null),isObject:s.bind(null),isObjectLike:h.bind(null),isRegExp:d.bind(null),isString:c.bind(null),isUndefined:y.bind(null),map:x.bind(null),notInArray:$.bind(null),sortBy:z.bind(null),truthy:m.bind(null),union:S.bind(null),unique:q.bind(null)}},nn.setup=function(n){Object.assign(un,n||{})},nn.Query=function(n,r){return this instanceof nn.Query?(this._criteria=n,this._projection=r,this._compiled=[],void this._compile()):new nn.Query(n,r)},nn.Query.prototype={_compile:function(){if(!O(this._criteria)){e(s(this._criteria),"Criteria must be of type Object");for(var n in this._criteria)if(_(this._criteria,n)){var r=this._criteria[n];if(["$and","$or","$nor","$where"].includes(n))this._processOperator(n,n,r);else{r=B(r);for(var t in r)_(r,t)&&this._processOperator(n,t,r[t])}}}},_processOperator:function(n,r,t){if(!L(Sn).includes(r))throw new Error("Invalid query operator '"+r+"' detected");this._compiled.push(ln[r](n,t))},test:function(n){for(var r=0;r<this._compiled.length;r++)if(!this._compiled[r].test(n))return!1;return!0},find:function(n,r){return new nn.Cursor(n,this,r)},remove:function(n){for(var r=[],t=0;t<n.length;t++)this.test(n[t])||r.push(n[t]);return r}},rn){var on=require("stream").Transform,an=require("util");nn.Query.prototype.stream=function(n){return new nn.Stream(this,n)},nn.Stream=function(n,r){return this instanceof nn.Stream?(r=r||{},Object.assign(r,{objectMode:!0}),on.call(this,r),void(this._query=n)):new nn.Stream(n,r)},an.inherits(nn.Stream,on),nn.Stream.prototype._transform=function(n,r,t){if(s(n)&&this._query.test(n))if(O(this._query._projection))this.push(n);else{var e=new nn.Cursor([n],this._query);e.hasNext()&&this.push(e.next())}t()}}nn.Cursor=function(n,r,t){return this instanceof nn.Cursor?(this._query=r,this._collection=n,this._projection=t||r._projection,this._operators={},this._result=!1,void(this._position=0)):new nn.Cursor(n,r,t)},nn.Cursor.prototype={_fetch:function(){var n=this;if(this._result!==!1)return this._result;if(s(this._projection)&&Object.assign(this._operators,{$project:this._projection}),!f(this._collection))throw new Error("Input collection is not of valid type. Must be an Array.");this._result=this._collection.filter(this._query.test,this._query);var r=[];if(["$sort","$skip","$limit","$project"].forEach(function(t){if(_(n._operators,t)){var e={};e[t]=n._operators[t],r.push(e)}}),r.length>0){var t=new nn.Aggregator(r);this._result=t.run(this._result,this._query)}return this._result},all:function(){return this._fetch()},first:function(){return this.count()>0?this._fetch()[0]:null},last:function(){return this.count()>0?this._fetch()[this.count()-1]:null},count:function(){return this._fetch().length},skip:function(n){return Object.assign(this._operators,{$skip:n}),this},limit:function(n){return Object.assign(this._operators,{$limit:n}),this},sort:function(n){return Object.assign(this._operators,{$sort:n}),this},next:function(){return this.hasNext()?this._fetch()[this._position++]:null},hasNext:function(){return this.count()>this._position},max:function(n){return pn.$max(this._fetch(),n)},min:function(n){return pn.$min(this._fetch(),n)},map:function(n){return this._fetch().map(n)},forEach:function(n){this._fetch().forEach(n)}},nn.Aggregator=function(n){return this instanceof nn.Aggregator?void(this._operators=n):new nn.Aggregator(n)},nn.Aggregator.prototype={run:function(n,r){if(!O(this._operators))for(var t=0;t<this._operators.length;t++){var e=this._operators[t],u=Object.keys(e);if(1!==u.length||!L(qn).includes(u[0]))throw new Error("Invalid aggregation operator '"+u+"'");u=u[0];var i={pipelineOp:u};n=r instanceof nn.Query?cn[u].call(r,n,e[u],i):cn[u](n,e[u],i)}return n}},nn.find=function(n,r,t){return new nn.Query(r).find(n,t)},nn.remove=function(n,r){return new nn.Query(r).remove(n)},nn.aggregate=function(n,r){if(!f(r))throw new Error("Aggregation pipeline must be an array");return new nn.Aggregator(r).run(n)},nn.addOperators=function(n,r){var e=r({resolve:T,computeValue:K,ops:L,key:function(){return un.key}});t([Mn,An,qn,Cn,Sn].includes(n),"Could not identify type '"+n+"'");var u=L(n);Object.keys(e).forEach(function(r){t(/^\$\w+$/.test(r),"Invalid operator name '"+r+"'"),t(!u.includes(r),"Operator "+r+" is already defined for "+n+" operators")});var i={};switch(n){case Sn:Object.keys(e).forEach(function(n){i[n]=function(r,t){return function(e,u){return{test:function(i){var o=T(i,e),c=r.call(t,e,o,u);if(a(c))return c;if(c instanceof nn.Query)return c.test(i);throw new Error("Invalid return type for '"+n+"'. Must return a Boolean or Mingo.Query")}}}}(e[n],e)});break;case Cn:Object.keys(e).forEach(function(n){i[n]=function(n,r){return function(t,e,u){var i=T(t,u);return n.call(r,u,i,e)}}(e[n],e)});break;default:Object.keys(e).forEach(function(n){i[n]=function(n,r){return function(){var t=en.call(arguments);return n.apply(r,t)}}(e[n],e)})}Object.assign(Nn[n],i)},nn.CollectionMixin={query:function(n,r){return nn.find(this.toJSON(),n,r)},aggregate:function(n){return nn.aggregate.call(null,this.toJSON(),n)}};var cn={$addFields:function(n,r){var e=Object.keys(r);return n.map(function(n){return n=U(n),e.forEach(function(e){var u,i=r[e];if(s(i)){var o=Object.keys(i),a=o.filter(function(n){return 0===n.indexOf("$")});O(a)||(t(1===o.length,"Can have only one root operator in $addFields"),a=a[0],i=i[a],u=K(n,i,a))}else u=K(n,i,null);Q(n,e,function(n,r){n[r]=u},!0)}),n})},$group:function(n,r){var t=r[un.key],e=G(n,function(n){return K(n,t,t)}),u=[];return delete r[un.key],e.keys.forEach(function(n,t){var i={};y(n)||(i[un.key]=n);for(var o in r)_(r,o)&&(i[o]=W(e.groups[t],o,r[o]));u.push(i)}),u},$match:function(n,r){return new nn.Query(r).find(n).all()},$project:function(n,r){if(O(r))return n;for(var e=[],u=Object.keys(r),i=!1,o=[!1,!1],a=0;a<u.length;a++){var l=u[a],f=r[l];l!==un.key&&(0===f||f===!1?o[0]=!0:o[1]=!0,t(o[0]!==o[1],"Projection cannot have a mix of inclusion and exclusion."))}if(u.includes(un.key)){var h=r[un.key];0!==h&&h!==!1||(u=u.filter($.bind(null,[un.key])),t(!u.includes(un.key),"Must not contain collections _id"),i=O(u))}else u.push(un.key);for(var a=0;a<n.length;a++){var p=n[a],d={},v=!1,g=!1,b=[];i&&b.push(un.key),u.forEach(function(n){var t,e,u=r[n];if(n!==un.key&&0===u&&(g=!0),n===un.key&&O(u))t=p[n];else if(c(u))t=K(p,u,n);else if(1===u||u===!0);else{if(!s(u))return void b.push(n);var i=Object.keys(u);i=i.length>1?!1:i[0],i!==!1&&L(Cn).includes(i)?(t=hn[i](p,u[i],n),"$slice"===i&&(v=!0)):t=K(p,u,n)}t=U(t),e=U(D(p,n)),y(e)?y(t)||(d[n]=t):(y(t)||R(e,n,t),Object.assign(d,e))}),(v||g||i)&&(d=Object.assign(U(p),d),b.forEach(function(n){P(d,n)})),e.push(d)}return e},$limit:function(n,r){return n.slice(0,r)},$skip:function(n,r){return n.slice(r)},$unwind:function(n,r){for(var t=[],e=r.substr(1),u=0;u<n.length;u++){var i=n[u],o=N(i,e);if(!f(o))throw new Error("Target field '"+e+"' is not of type Array.");o.forEach(function(n){var r=U(i);r[e]=n,t.push(r)})}return t},$sort:function(n,r){if(!O(r)&&s(r)){var t=Object.keys(r);t.reverse().forEach(function(t){var e=G(n,function(n){return T(n,t)}),u={},i=function(n){return u[V(n)]},o=z(e.keys,function(n,r){return u[V(n)]=r,n});-1===r[t]&&o.reverse(),n=[],o.forEach(function(r){tn.apply(n,e.groups[i(r)])})})}return n},$sortByCount:function(n,r){var t={count:{$sum:1}};return t[un.key]=r,this.$sort(this.$group(n,t),{count:-1})},$sample:function(n,r){var t=r.size;e(l(t),"$sample size must be a positive integer. See https://docs.mongodb.com/manual/reference/operator/aggregation/sample/");for(var u=[],i=0;t>i;i++){var o=Math.floor(Math.random()*n.length);u.push(n[o])}return u},$count:function(n,r){t(c(r)&&""!==r.trim()&&-1===r.indexOf(".")&&"$"!==r.trim()[0],"Invalid expression value for $count. See https://docs.mongodb.com/manual/reference/operator/aggregation/count/");var e={};return e[r]=n.length,e},$replaceRoot:function(n,r){var t=r.newRoot,u=[];return n.forEach(function(n){n=K(n,t,null),e(s(n),"$replaceRoot expression must return a valid JS object. See https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/"),u.push(n)}),u},$redact:function(n,r){return n.map(function(n){return C(U(n),r)})}},ln={},fn={$and:function(n,r){e(f(r),"Invalid expression: $and expects value to be an Array");var t=[];return r.forEach(function(n){t.push(new nn.Query(n))}),{test:function(n){for(var r=0;r<t.length;r++)if(!t[r].test(n))return!1;return!0}}},$or:function(n,r){if(!f(r))throw new Error("Invalid expression for $or criteria");var t=[];return r.forEach(function(n){t.push(new nn.Query(n))}),{test:function(n){for(var r=0;r<t.length;r++)if(t[r].test(n))return!0;return!1}}},$nor:function(n,r){if(!f(r))throw new Error("Invalid expression for $nor criteria");var t=this.$or("$or",r);return{test:function(n){return!t.test(n)}}},$not:function(n,r){var t={};t[n]=B(r);var e=new nn.Query(t);return{test:function(n){return!e.test(n)}}},$where:function(n,r){return v(r)||(r=new Function("return "+r+";")),{test:function(n){return r.call(n)===!0}}}};Object.assign(ln,fn);var sn={$eq:function(n,r){return M(n,r)||f(n)&&-1!==n.findIndex(M.bind(null,r))},$ne:function(n,r){return!this.$eq(n,r)},$in:function(n,r){return n=j(n),I(n,r).length>0},$nin:function(n,r){return y(n)||!this.$in(n,r)},$lt:function(n,t){return n=j(n).find(function(n){return t>n}),n!==r},$lte:function(n,t){return n=j(n).find(function(n){return t>=n}),n!==r},$gt:function(n,t){return n=j(n).find(function(n){return n>t}),n!==r},$gte:function(n,t){return n=j(n).find(function(n){return n>=t}),n!==r},$mod:function(n,t){return n=j(n).find(function(n){return l(n)&&f(t)&&2===t.length&&n%t[0]===t[1]}),n!==r},$regex:function(n,t){return n=j(n).find(function(n){return c(n)&&d(t)&&!!n.match(t)}),n!==r},$exists:function(n,r){return r===!1&&y(n)||r===!0&&!y(n)},$all:function(n,r){var t=this,e=!1;if(f(n)&&f(r))for(var u=0;u<r.length;u++){if(!s(r[u])||!Object.keys(r[u]).includes("$elemMatch"))return I(r,n).length===r.length;e=e||t.$elemMatch(n,r[u].$elemMatch)}return e},$size:function(n,r){return f(n)&&l(r)&&n.length===r},$elemMatch:function(n,r){if(f(n)&&!O(n))for(var t=new nn.Query(r),e=0;e<n.length;e++)if(t.test(n[e]))return!0;return!1},$type:function(n,r){switch(r){case 1:return l(n)&&-1!==(n+"").indexOf(".");case 2:case 5:return c(n);case 3:return s(n);case 4:return f(n);case 8:return a(n);case 9:return p(n);case 10:return g(n);case 11:return d(n);case 16:return l(n)&&2147483647>=n&&-1===(n+"").indexOf(".");case 18:return l(n)&&n>2147483647&&0x8000000000000000>=n&&-1===(n+"").indexOf(".");default:return!1}}};Object.keys(sn).forEach(function(n){ln[n]=function(n,r){return function(t,e){return{test:function(u){var i=T(u,t);return n.call(r,i,e)}}}}(sn[n],sn)});var hn={$:function(n,r,t){throw new Error("$ not implemented")},$elemMatch:function(n,t,e){var u=T(n,e),i=new nn.Query(t);if(y(u)||!f(u))return r;for(var o=0;o<u.length;o++)if(i.test(u[o]))return[u[o]];return r},$slice:function(n,r,t){var e=T(n,t);if(!f(e))return e;if(f(r)){var u=r[0]<0?e.length+r[0]:r,i=u+r[1];r=[u,i]}else{if(!l(r))throw new Error("Invalid type for $slice operator");r=0>r?[r]:[0,r]}return en.apply(e,r)},$stdDevPop:function(n,r,t){var e=K(n,r,t);return X({dataset:e,sampled:!1})},$stdDevSamp:function(n,r,t){var e=K(n,r,t);return X({dataset:e,sampled:!0})}},pn={$addToSet:function(n,r){return q(this.$push(n,r))},$sum:function(n,r){return f(n)?l(r)?n.length*r:this.$push(n,r).filter(l).reduce(function(n,r){return n+r},0):0},$max:function(n,r){var t,e=this.$push(n,r);return e.length>0&&(t=e[0],e.forEach(function(n){n>t&&(t=n)})),t},$min:function(n,r){var t,e=this.$push(n,r);return e.length>0&&(t=e[0],e.forEach(function(n){t>n&&(t=n)})),t},$avg:function(n,r){var t=this.$push(n,r).filter(l),e=t.reduce(function(n,r){return n+r},0);return e/(t.length||1)},$push:function(n,r){return g(r)?U(n):n.map(function(n){return K(n,r,null)})},$first:function(n,t){return n.length>0?K(n[0],t):r},$last:function(n,t){return n.length>0?K(n[n.length-1],t):r},$stdDevPop:function(n,r){var t=this.$push(n,r).filter(l);return X({dataset:t,sampled:!1})},$stdDevSamp:function(n,r){var t=this.$push(n,r).filter(l);return X({dataset:t,sampled:!0})}},dn={$abs:function(n,t){var e=K(n,t,null);return null===e||e===r?null:Math.abs(e)},$add:function(n,r){var t=K(n,r,null);return t.reduce(function(n,r){return n+r},0)},$subtract:function(n,r){var t=K(n,r,null);return t[0]-t[1]},$divide:function(n,r){var t=K(n,r,null);return t[0]/t[1]},$multiply:function(n,r){var t=K(n,r,null);return t.reduce(function(n,r){return n*r},1)},$mod:function(n,r){var t=K(n,r,null);return t[0]%t[1]}},vn={$concat:function(n,t){var e=K(n,t,null);return[null,r].some(b.bind(null,e))?null:e.join("")},$strcasecmp:function(n,r){var t=K(n,r,null);return t[0]=O(t[0])?"":t[0].toUpperCase(),t[1]=O(t[1])?"":t[1].toUpperCase(),t[0]>t[1]?1:t[0]<t[1]?-1:0},$substr:function(n,r){var t=K(n,r,null);return c(t[0])?t[1]<0?"":t[2]<0?t[0].substr(t[1]):t[0].substr(t[1],t[2]):""},$toLower:function(n,r){var t=K(n,r,null);return O(t)?"":t.toLowerCase()},$toUpper:function(n,r){var t=K(n,r,null);return O(t)?"":t.toUpperCase()}},gn={$dayOfYear:function(n,t){var e=K(n,t,null);if(p(e)){var u=new Date(e.getFullYear(),0,0),i=e-u,o=864e5;return Math.round(i/o)}return r},$dayOfMonth:function(n,t){var e=K(n,t,null);return p(e)?e.getDate():r},$dayOfWeek:function(n,t){var e=K(n,t,null);return p(e)?e.getDay()+1:r},$year:function(n,t){var e=K(n,t,null);return p(e)?e.getFullYear():r},$month:function(n,t){var e=K(n,t,null);return p(e)?e.getMonth()+1:r},$week:function(n,r){var t=K(n,r,null);t=new Date(+t),t.setHours(0,0,0),t.setDate(t.getDate()+4-(t.getDay()||7));var e=new Date(t.getFullYear(),0,1);return Math.floor(((t-e)/864e5+1)/7)},$hour:function(n,t){var e=K(n,t,null);return p(e)?e.getHours():r},$minute:function(n,t){var e=K(n,t,null);return p(e)?e.getMinutes():r},$second:function(n,t){var e=K(n,t,null);return p(e)?e.getSeconds():r},$millisecond:function(n,t){var e=K(n,t,null);return p(e)?e.getMilliseconds():r},$dateToString:function(n,r){for(var t=r.format,e=K(n,r.date,null),u=t.match(/(%%|%Y|%m|%d|%H|%M|%S|%L|%j|%w|%U)/g),i=0,o=u.length;o>i;i++){var a=Tn[u[i]],c=a;if(f(a)){var l=this[a[0]],s=a[1];c=J(l.call(this,n,e),s)}t=t.replace(u[i],c)}return t}},yn={$setEquals:function(n,r){var t=K(n,r,null),e=q(t[0]),u=q(t[1]);return e.length===u.length&&e.length===I(e,u).length},$setIntersection:function(n,r){var t=K(n,r,null);return I(t[0],t[1])},$setDifference:function(n,r){var t=K(n,r,null);return t[0].filter($.bind(null,t[1]))},$setUnion:function(n,r){var t=K(n,r,null);return S(t[0],t[1])},$setIsSubset:function(n,r){var t=K(n,r,null);return I(t[0],t[1]).length===t[0].length},$anyElementTrue:function(n,r){var t=K(n,r,null)[0];return t.some(m)},$allElementsTrue:function(n,r){var t=K(n,r,null)[0];return t.every(m)}},$n={$cond:function(n,r){var t,e,u;if(f(r)){if(3!=r.length)throw new Error("Invalid arguments for $cond operator");t=r[0],e=r[1],u=r[2]}else s(r)&&(t=r["if"],e=r.then,u=r["else"]);var i=K(n,t,null);return i?K(n,e,null):K(n,u,null)},$switch:function(n,r){if(!r.branches)throw new Error("Invalid arguments for $switch operator");var t=r.branches.find(function(r){if(!r["case"]||!r.then)throw new Error("Invalid arguments for $switch operator");return K(n,r["case"],null)});if(t)return K(n,t.then,null);if(r["default"])return K(n,r["default"],null);throw new Error("Invalid arguments for $switch operator")},$ifNull:function(n,e){t(f(e)&&2===e.length,"Invalid arguments for $ifNull operator");var u=K(n,e,null);return null===u[0]||u[0]===r?u[1]:u[0]}},bn={$cmp:function(n,r){var t=K(n,r,null);return t[0]>t[1]?1:t[0]<t[1]?-1:0}};["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"].forEach(function(n){bn[n]=function(r,t){var e=K(r,t,null);return sn[n](e[0],e[1])}});var mn={$size:function(n,t){var e=K(n,t,null);return f(e)?e.length:r}},wn={$literal:function(n,r){return r}},On={$map:function(n,r){var t=K(n,r.input,null);if(!f(t))throw new Error("Input expression for $map must resolve to an array");var e=r.as,u=r["in"],i="$"+e,o=n[i];return t.map(function(r){n[i]=r;var t=K(n,u,null);return y(o)?delete n[i]:n[i]=o,t})},$let:function(n,r){var t=r.vars,e=r["in"],u={},i=Object.keys(t);i.forEach(function(r){var e=K(n,t[r],null),i="$"+r;u[i]=n[i],n[i]=e});var o=K(n,e,null);return i.forEach(function(r){var t="$"+r;y(u[t])?delete n[t]:n[t]=u[t]}),o}},jn={$and:function(n,r){var t=K(n,r,null);return m(t)&&t.every(m)},$or:function(n,r){var t=K(n,r,null);return m(t)&&t.some(m)},$not:function(n,r){return!K(n,r[0],null)}},En=Object.assign({},mn,dn,jn,bn,$n,gn,wn,yn,vn,On),_n={$$ROOT:function(n,r,t){return t.root},$$CURRENT:function(n,r,t){return n}},kn={$$KEEP:function(n,r,t){return n},$$PRUNE:function(n,t,e){return r},$$DESCEND:function(n,r,t){if(!_(r,"$cond"))return n;var e;return k(n,function(u,i){h(u)&&(f(u)?(e=[],u.forEach(function(n,u){s(n)&&(n=C(n,r,t)),y(n)||e.push(n)})):e=C(u,r,t),y(e)?delete n[i]:n[i]=e)}),n}},xn=Object.keys(_n),In=Object.keys(kn),Sn=nn.OP_QUERY="query",An=nn.OP_GROUP="group",Mn=nn.OP_AGGREGATE="aggregate",qn=nn.OP_PIPELINE="pipeline",Cn=nn.OP_PROJECTION="projection",Nn={aggregate:En,group:pn,pipeline:cn,projection:hn,query:ln},Tn={"%Y":["$year",4],"%m":["$month",2],"%d":["$dayOfMonth",2],"%H":["$hour",2],"%M":["$minute",2],"%S":["$second",2],"%L":["$millisecond",3],"%j":["$dayOfYear",3],"%w":["$dayOfWeek",1],"%U":["$week",2],"%%":"%"},Dn=[c,a,l,p,g,d,y]}(this); | ||
!function(n){"use strict";function t(n,t,r){r=r||{},r.root=r.root||l(n);var e=m(n,t,null,r);return In.includes(e)?kn[e](n,t,r):e}function r(n,t){return n[t]}function e(n,t,u){for(var i=t.split("."),o=n,a=0;a<i.length;a++){var l=q(i[a].match(/^\d+$/));if(l&&M(o)){if(u===!0&&0===a)return o;o=o.map(function(n){return e(n,i[a],!0)}),1===o.length&&(o=o[0])}else o=r(o,i[a]),u=!1;if(S(o))break}return o}function u(n,t){if(!S(n)){var e,i,o=t.split("."),a=o[0],l=1===o.length||o.slice(1).join("."),s=null!==a.match(/^\d+$/);try{1===o.length?M(n)?s?(e=r(n,a),x(e),e=[e]):(e=[],J(n,function(n){i=u(n,t),S(i)||e.push(i)}),b(e.length>0)):(i=r(n,a),x(i),e={},e[a]=i):M(n)?s?(e=r(n,a),e=u(e,l),x(e),e=[e]):(e=[],J(n,function(n){i=u(n,t),S(i)||e.push(i)}),b(e.length>0)):(i=r(n,a),i=u(i,l),x(i),e={},e[a]=i)}catch(c){e=void 0}return e}}function i(n,t,r,e){var u=t.split("."),o=u[0],a=1===u.length||u.slice(1).join("."),l=/^\d+$/.test(o);if(1===u.length)r(n,o);else if(M(n)&&!l)J(n,function(n){i(n,t,r,e)});else{if(e===!0){var s=T(n,o);s&&!D(n[o])||(n[o]={})}i(n[o],a,r,e)}}function o(n,t,r){i(n,t,function(n,t){n[t]=r})}function a(n,t){i(n,t,function(n,t){M(n)&&/^\d+$/.test(t)?n.splice(parseInt(t),1):k(n)&&delete n[t]})}function l(n){switch(B(n)){case"array":return n.map(l);case"object":return G(n,l);default:return n}}function s(n){for(var t=0;t<Rn.length;t++)if(Rn[t](n))return!0;return!1}function c(n){return s(n)||!A(n)}function f(n){if(c(n))return E(n)?{$regex:n}:{$eq:n};if(A(n)){var t=z(n),r=0===H(d(En),t).length;if(r)return{$eq:n};if(t.includes("$regex")){var e=n.$regex,u=n.$options||"",i="";N(e)&&(i+=e.ignoreCase||u.indexOf("i")>=0?"i":"",i+=e.multiline||u.indexOf("m")>=0?"m":"",i+=e.global||u.indexOf("g")>=0?"g":"",e=new RegExp(e,i)),n.$regex=e,delete n.$options}}return n}function h(n,t){return new Array(Math.max(t-String(n).length+1,0)).join("0")+n}function d(n){return z(Pn[n])}function v(n,t,r){for(var e,u,i,o={},a=[],s=n.length,c=0;s>c;c++)u=n[c],e=t.call(r,u,c),i=$(u),T(o,i)||(o[i]=[e,c]),a.push(l(u));return a.sort(function(n,t){var r=o[$(n)],e=o[$(t)];return r[0]<e[0]?-1:r[0]>e[0]?1:r[1]<e[1]?-1:r[1]>e[1]?1:0}),b(a.length===n.length,"sortBy must retain collection length"),a}function p(n,t,r){var e={keys:[],groups:[]},u={};return J(n,function(n){var i=t.call(r,n),o=$(i),a=-1;S(u[o])&&(a=e.keys.length,u[o]=a,e.keys.push(i),e.groups.push([])),a=u[o],e.groups[a].push(n)}),b(e.keys.length===e.groups.length,"Cardinality must be equal for groups and keys"),e}function g(n){return ln({"":n})+B(n)+n}function $(n){var t,r,e,u=0,i=g(n);if(0===i.length)return u;for(t=0,e=i.length;e>t;t++)r=i.charCodeAt(t),u=(u<<5)-u+r,u|=0;return u.toString()}function y(n,t,r){if(d(Cn).includes(t))return pn[t](n,r);if(k(r)){var e={};for(var u in r)if(T(r,u)&&(e[u]=y(n,u,r[u]),d(Cn).includes(u))){e=e[u],z(r).length>1&&Y("Invalid $group expression '"+ln(r)+"'");break}return e}}function m(n,t,r,u){if(u=u||{},u.root=u.root||l(n),d(qn).includes(r))return wn[r](n,t,u);if(d(Cn).includes(r))return n=m(n,t,null,u),b(M(n),"Must use collection type with "+r+" operator"),pn[r](n,null,u);if(N(t)&&t.length>0&&"$"===t[0]){if(An.includes(t))return Mn[t](n,null,u);if(In.includes(t))return t;var i=An.filter(function(n){return 0===t.indexOf(n+".")});return 1===i.length&&(i=i[0],"$$ROOT"===i&&(n=u.root),t=t.substr(i.length)),e(n,t.slice(1))}switch(B(t)){case"array":return t.map(function(t){return m(n,t,null)});case"object":var o={};for(var a in t)if(T(t,a)&&(o[a]=m(n,t[a],a,u),d(qn).includes(a))){b(1===z(t).length,"Invalid aggregation expression '"+ln(t)+"'"),o=o[a];break}return o;default:return l(t)}}function b(n,t){L(n)&&Y(t)}function x(n){return b(!S(n))}function O(n,t){b(n===Object(n),t)}function _(n,t){return B(n)===t}function j(n){return _(n,"boolean")}function N(n){return _(n,"string")}function w(n){return _(n,"number")}function M(n){return _(n,"array")}function k(n){return _(n,"object")}function A(n){return n===Object(n)}function I(n){return _(n,"date")}function E(n,t){return _(n,"regexp")}function C(n,t){return _(n,"function")}function q(n){return _(n,"null")}function S(n){return _(n,"undefined")}function D(n){return q(n)||S(n)}function P(n,t){return!n.includes(t)}function Q(n,t){return n.includes(t)}function R(n){return!!n}function L(n){return!n}function U(n){return D(n)||M(n)&&0===n.length||k(n)&&0===z(n).length||!n}function F(n){return M(n)?n:[n]}function B(n){return Object.prototype.toString.call(n).match(/\s(\w+)/)[1].toLowerCase()}function T(n,t){return Object.prototype.hasOwnProperty.call(n,t)}function Y(n){throw new Error(n)}function z(n){return Object.keys(n)}function J(n,t,r){if(O(n,"Cannot iterate over object of type '"+B(n)+"'"),M(n))n.forEach(t,r);else for(var e in n)T(n,e)&&t.call(r,n[e],e)}function G(n,t,r){if(M(n))return n.map(t,r);if(k(n)){for(var e,u={},i=z(n),o=0,a=i.length;a>o;o++)e=i[o],u[e]=t.call(r,n[e],e);return u}Y("Input must be an Array or Object type")}function H(n,t){return n.filter(Q.bind(null,t))}function K(n,t){var r=[];return on.apply(r,n),on.apply(r,t.filter(P.bind(null,n))),r}function V(n,t){b(M(n),"Input must be an Array");var r=[],e=function(n,t){for(var u=0,i=n.length;i>u;u++)M(n[u])&&(t>0||0>t)?e(n[u],Math.max(-1,t-1)):on.call(r,n[u])};return e(n,t||-1),r}function W(n,t){if(n===t)return!0;var r=B(n);if(r!==B(t))return!1;if("number"===r&&isNaN(n)&&isNaN(t))return!0;if(["date","regexp"].includes(r))return n.toString()===t.toString();var e,u;if("array"===r){if(n.length===t.length&&0===n.length)return!0;if(n.length!==t.length)return!1;for(e=0,u=n.length;u>e;e++)if(!W(n[e],t[e]))return!1}else{if(![n,t].every(k))return!1;var i=z(n),o=z(t);if(i.length!==o.length)return!1;if(i.sort(),o.sort(),!W(i,o))return!1;for(e=0,u=i.length;u>e;e++){var a=i[e];if(!W(n[a],t[a]))return!1}}return!0}function X(n){var t={},r=[];return J(n,function(n){var e=$(n);T(t,e)||(r.push(n),t[e]=0)}),r}function Z(n){var t=n.dataset.reduce(function(n,t){return n+t},0),r=n.dataset.length||1,e=n.sampled===!0?1:0,u=t/(r-e);return Math.sqrt(n.dataset.reduce(function(n,t){return n+Math.pow(t-u,2)},0)/r)}function nn(n,t,r){return D(r)?0>t?(t=Math.max(0,n.length+t),r=n.length-t+1):(r=t,t=0):(0>t&&(t=Math.max(0,n.length+t)),b(r>0,"Invalid argument value for $slice operator. Limit must be a positive number"),r+=t),an.apply(n,[t,r])}var tn,rn="1.0.0",en={};null!==n&&(tn=n.Mingo),en.noConflict=function(){return n.Mingo=tn,en};var un="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require;un?module.exports=en:n.Mingo=en;var on=Array.prototype.push,an=Array.prototype.slice,ln=JSON.stringify;!function(){Function.prototype.bind||(Function.prototype.bind=function(n){"function"!=typeof this&&Y("Function.prototype.bind - what is trying to be bound is not callable");var t=an.call(arguments,1),r=this,e=function(){},u=function(){return r.apply(this instanceof e?this:n,t.concat(an.call(arguments)))};return this.prototype&&(e.prototype=this.prototype),u.prototype=new e,u}),Array.prototype.includes||(Array.prototype.includes=function(n){null===this&&Y("Array.prototype.includes called on null or undefined");var t=Object(this),r=parseInt(t.length,10)||0;if(0===r)return!1;var e,u=parseInt(arguments[1],10)||0;u>=0?e=u:(e=r+u,0>e&&(e=0));for(var i;r>e;){if(i=t[e],n===i||isNaN(n)&&isNaN(i))return!0;e++}return!1}),Array.prototype.find||(Array.prototype.find=function(n){null===this&&Y("Array.prototype.find called on null or undefined"),C(n)||Y("predicate must be a function");for(var t,r=Object(this),e=r.length>>>0,u=arguments[1],i=0;e>i;i++)if(t=r[i],n.call(u,t,i,r))return t}),Array.prototype.findIndex||Object.defineProperty(Array.prototype,"findIndex",{value:function(n){null==this&&Y("Array.prototype.findIndex called on null or undefined"),"function"!=typeof n&&Y("predicate must be a function");for(var t,r=Object(this),e=r.length>>>0,u=arguments[1],i=0;e>i;i++)if(t=r[i],n.call(u,t,i,r))return i;return-1},enumerable:!1,configurable:!1,writable:!1}),Object.keys||(Object.keys=function(n){O(n,"keys called on a non-object");var t=[];for(var r in n)T(n,r)&&t.push(r);return t}),Object.values||(Object.values=function(n){O(n,"Object.values called on a non-object");var t=[];for(var r in n)T(n,r)&&t.push(n[r]);return t}),Object.assign||(Object.assign=function(n){D(n)&&Y("Cannot convert undefined or null to object");for(var t=Object(n),r=1;r<arguments.length;r++){var e=arguments[r];if(!D(e))for(var u in e)T(e,u)&&(t[u]=e[u])}return t})}();var sn={key:"_id"};en.idKey=function(){return sn.key},en._internal=function(){return{assert:b.bind(null),computeValue:m.bind(null),each:J.bind(null),err:Y.bind(null),falsey:L.bind(null),flatten:V.bind(null),groupBy:p.bind(null),has:T.bind(null),hashcode:$.bind(null),inArray:Q.bind(null),intersection:H.bind(null),isArray:M.bind(null),isBoolean:j.bind(null),isDate:I.bind(null),isEmpty:U.bind(null),isEqual:W.bind(null),isFunction:C.bind(null),isNull:q.bind(null),isNumber:w.bind(null),isObject:k.bind(null),isObjectLike:A.bind(null),isRegExp:E.bind(null),isString:N.bind(null),isUndefined:S.bind(null),isUnknown:D.bind(null),keys:z.bind(null),map:G.bind(null),notInArray:P.bind(null),ops:d.bind(null),resolve:e.bind(null),resolveObj:u.bind(null),slice:nn.bind(null),stddev:Z.bind(null),stringify:ln.bind(null),sortBy:v.bind(null),truthy:R.bind(null),type:B.bind(null),union:K.bind(null),unique:X.bind(null)}},en.setup=function(n){Object.assign(sn,n||{})},en.Query=function(n,t){return this instanceof en.Query?(this._criteria=n,this._projection=t,this._compiled=[],void this._compile()):new en.Query(n,t)},en.Query.prototype={_compile:function(){if(!U(this._criteria)){b(k(this._criteria),"Criteria must be of type Object");for(var n in this._criteria)if(T(this._criteria,n)){var t=this._criteria[n];if(["$and","$or","$nor","$where"].includes(n))this._processOperator(n,n,t);else{t=f(t);for(var r in t)T(t,r)&&this._processOperator(n,r,t[r])}}}},_processOperator:function(n,t,r){d(En).includes(t)?this._compiled.push(fn[t](n,r)):Y("Invalid query operator '"+t+"' detected")},test:function(n){for(var t=0;t<this._compiled.length;t++)if(!this._compiled[t].test(n))return!1;return!0},find:function(n,t){return new en.Cursor(n,this,t)},remove:function(n){for(var t=[],r=0;r<n.length;r++)this.test(n[r])||t.push(n[r]);return t}},en.Cursor=function(n,t,r){return this instanceof en.Cursor?(this._query=t,this._collection=n,this._projection=r||t._projection,this._operators={},this._result=!1,void(this._position=0)):new en.Cursor(n,t,r)},en.Cursor.prototype={_fetch:function(){var n=this;if(this._result!==!1)return this._result;k(this._projection)&&Object.assign(this._operators,{$project:this._projection}),M(this._collection)||Y("Input collection is not of valid type. Must be an Array."),this._result=this._collection.filter(this._query.test,this._query);var t=[];if(J(["$sort","$skip","$limit","$project"],function(r){if(T(n._operators,r)){var e={};e[r]=n._operators[r],t.push(e)}}),t.length>0){var r=new en.Aggregator(t);this._result=r.run(this._result,this._query)}return this._result},all:function(){return this._fetch()},first:function(){return this.count()>0?this._fetch()[0]:null},last:function(){return this.count()>0?this._fetch()[this.count()-1]:null},count:function(){return this._fetch().length},skip:function(n){return Object.assign(this._operators,{$skip:n}),this},limit:function(n){return Object.assign(this._operators,{$limit:n}),this},sort:function(n){return Object.assign(this._operators,{$sort:n}),this},next:function(){return this.hasNext()?this._fetch()[this._position++]:null},hasNext:function(){return this.count()>this._position},max:function(n){return pn.$max(this._fetch(),n)},min:function(n){return pn.$min(this._fetch(),n)},map:function(n){return this._fetch().map(n)},forEach:function(n){this._fetch().forEach(n)}},en.Aggregator=function(n){return this instanceof en.Aggregator?void(this._operators=n):new en.Aggregator(n)},en.Aggregator.prototype={run:function(n,t){if(!U(this._operators))for(var r=0;r<this._operators.length;r++){var e=this._operators[r],u=z(e);if(1===u.length&&d(Sn).includes(u[0])){u=u[0];var i={pipelineOp:u};n=t instanceof en.Query?cn[u].call(t,n,e[u],i):cn[u](n,e[u],i)}else Y("Invalid aggregation operator '"+u+"'")}return n}},en.find=function(n,t,r){return new en.Query(t).find(n,r)},en.remove=function(n,t){return new en.Query(t).remove(n)},en.aggregate=function(n,t){return M(t)||Y("Aggregation pipeline must be an array"),new en.Aggregator(t).run(n)},en.addOperators=function(n,t){var r=t(Object.assign({idKey:function(){return sn.key}},en._internal()));b([qn,Cn,Sn,Dn,En].includes(n),"Could not identify operator class '"+n+"'");var u=d(n);J(r,function(t,r){b(/^\$\w+$/.test(r),"Invalid operator name '"+r+"'"),b(!u.includes(r),"Operator "+r+" is already defined for "+n+" operators")});var i={};switch(n){case En:J(r,function(n,t){i[t]=function(n,r){return function(u,i){return{test:function(o){var a=e(o,u),l=n.call(r,u,a,i);return j(l)?l:l instanceof en.Query?l.test(o):void Y("Invalid return type for '"+t+"'. Must return a Boolean or Mingo.Query")}}}}(n,r)});break;case Dn:J(r,function(n,t){i[t]=function(n,t){return function(r,u,i){var o=e(r,i);return n.call(t,i,o,u)}}(n,r)});break;default:J(r,function(n,t){i[t]=function(n,t){return function(){var r=an.call(arguments);return n.apply(t,r)}}(n,r)})}Object.assign(Pn[n],i)},en.CollectionMixin={query:function(n,t){return en.find(this.toJSON(),n,t)},aggregate:function(n){return en.aggregate.call(null,this.toJSON(),n)}};var cn={$addFields:function(n,t){var r=z(t);return n.map(function(n){return n=l(n),J(r,function(r){var e,u=t[r];if(k(u)){var o=z(u),a=o.filter(function(n){return 0===n.indexOf("$")});U(a)||(b(1===o.length,"Can have only one root operator in $addFields"),a=a[0],u=u[a],e=m(n,u,a))}else e=m(n,u,null);i(n,r,function(n,t){n[t]=e},!0)}),n})},$group:function(n,t){var r=t[sn.key],e=p(n,function(n){return m(n,r,r)}),u=[];return delete t[sn.key],J(e.keys,function(n,r){var i={};S(n)||(i[sn.key]=n);for(var o in t)T(t,o)&&(i[o]=y(e.groups[r],o,t[o]));u.push(i)}),u},$match:function(n,t){return new en.Query(t).find(n).all()},$project:function(n,t){if(U(t))return n;var r=[],e=z(t),i=!1,s=[!1,!1];if(J(e,function(n){var r=t[n];n!==sn.key&&(0===r||r===!1?s[0]=!0:s[1]=!0,b(s[0]!==s[1],"Projection cannot have a mix of inclusion and exclusion."))}),e.includes(sn.key)){var c=t[sn.key];0!==c&&c!==!1||(e=e.filter(P.bind(null,[sn.key])),b(!e.includes(sn.key),"Must not contain collections _id"),i=U(e))}else e.push(sn.key);return J(n,function(n,s){var c={},f=!1,h=!1,v=[];i&&v.push(sn.key),J(e,function(r){var e,i,a=t[r];if(r!==sn.key&&0===a&&(h=!0),r===sn.key&&U(a))e=n[r];else if(N(a))e=m(n,a,r);else if(1===a||a===!0);else{if(!k(a))return void v.push(r);var s=z(a);s=s.length>1?!1:s[0],d(Dn).includes(s)?"$slice"===s?F(a[s]).every(w)?(e=vn[s](n,a[s],r),f=!0):e=m(n,a,r):e=vn[s](n,a[s],r):e=m(n,a,r)}e=l(e),i=l(u(n,r)),S(i)?S(e)||(c[r]=e):(S(e)||o(i,r,e),Object.assign(c,i))}),(f||h||i)&&(c=Object.assign(l(n),c),J(v,function(n){a(c,n)})),r.push(c)}),r},$limit:function(n,t){return n.slice(0,t)},$skip:function(n,t){return n.slice(t)},$unwind:function(n,t){for(var e=[],u=t.substr(1),i=0;i<n.length;i++){var o=n[i],a=r(o,u);M(a)?J(a,function(n){var t=l(o);t[u]=n,e.push(t)}):Y("Target field '"+u+"' is not of type Array.")}return e},$sort:function(n,t){if(!U(t)&&k(t)){var r=z(t);J(r.reverse(),function(r){var u=p(n,function(n){return e(n,r)}),i={},o=function(n){return i[$(n)]},a=v(u.keys,function(n,t){return i[$(n)]=t,n});-1===t[r]&&a.reverse(),n=[],J(a,function(t){on.apply(n,u.groups[o(t)])})})}return n},$sortByCount:function(n,t){var r={count:{$sum:1}};return r[sn.key]=t,this.$sort(this.$group(n,r),{count:-1})},$sample:function(n,t){var r=t.size;b(w(r),"$sample size must be a positive integer. See https://docs.mongodb.com/manual/reference/operator/aggregation/sample/");for(var e=[],u=0;r>u;u++){var i=Math.floor(Math.random()*n.length);e.push(n[i])}return e},$count:function(n,t){b(N(t)&&""!==t.trim()&&-1===t.indexOf(".")&&"$"!==t.trim()[0],"Invalid expression value for $count. See https://docs.mongodb.com/manual/reference/operator/aggregation/count/");var r={};return r[t]=n.length,r},$replaceRoot:function(n,t){var r=t.newRoot,e=[];return J(n,function(n){n=m(n,r,null),b(k(n),"$replaceRoot expression must return a valid JS object. See https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/"),e.push(n)}),e},$redact:function(n,r){return n.map(function(n){return t(l(n),r)})}},fn={},hn={$and:function(n,t){b(M(t),"Invalid expression: $and expects value to be an Array");var r=[];return J(t,function(n){r.push(new en.Query(n))}),{test:function(n){for(var t=0;t<r.length;t++)if(!r[t].test(n))return!1;return!0}}},$or:function(n,t){M(t)||Y("Invalid expression for $or criteria");var r=[];return J(t,function(n){r.push(new en.Query(n))}),{test:function(n){for(var t=0;t<r.length;t++)if(r[t].test(n))return!0;return!1}}},$nor:function(n,t){M(t)||Y("Invalid expression for $nor criteria");var r=this.$or("$or",t);return{test:function(n){return!r.test(n)}}},$not:function(n,t){var r={};r[n]=f(t);var e=new en.Query(r);return{test:function(n){return!e.test(n)}}},$where:function(n,t){return C(t)||(t=new Function("return "+t+";")),{test:function(n){return t.call(n)===!0}}}};Object.assign(fn,hn);var dn={$eq:function(n,t){return W(n,t)||M(n)&&-1!==n.findIndex(W.bind(null,t))},$ne:function(n,t){return!this.$eq(n,t)},$in:function(n,t){return n=F(n),H(n,t).length>0},$nin:function(n,t){return S(n)||!this.$in(n,t)},$lt:function(n,t){return n=F(n).find(function(n){return t>n}),void 0!==n},$lte:function(n,t){return n=F(n).find(function(n){return t>=n}),void 0!==n},$gt:function(n,t){return n=F(n).find(function(n){return n>t}),void 0!==n},$gte:function(n,t){return n=F(n).find(function(n){return n>=t}),void 0!==n},$mod:function(n,t){return n=F(n).find(function(n){return w(n)&&M(t)&&2===t.length&&n%t[0]===t[1]}),void 0!==n},$regex:function(n,t){return n=F(n).find(function(n){return N(n)&&E(t)&&!!n.match(t)}),void 0!==n},$exists:function(n,t){return t===!1&&S(n)||t===!0&&!S(n)},$all:function(n,t){var r=this,e=!1;if(M(n)&&M(t))for(var u=0;u<t.length;u++){if(!k(t[u])||!z(t[u]).includes("$elemMatch"))return H(t,n).length===t.length;e=e||r.$elemMatch(n,t[u].$elemMatch)}return e},$size:function(n,t){return M(n)&&w(t)&&n.length===t},$elemMatch:function(n,t){if(M(n)&&!U(n))for(var r=new en.Query(t),e=0;e<n.length;e++)if(r.test(n[e]))return!0;return!1},$type:function(n,t){switch(t){case 1:return w(n)&&-1!==(n+"").indexOf(".");case 2:case 5:return N(n);case 3:return k(n);case 4:return M(n);case 8:return j(n);case 9:return I(n);case 10:return q(n);case 11:return E(n);case 16:return w(n)&&2147483647>=n&&-1===(n+"").indexOf(".");case 18:return w(n)&&n>2147483647&&0x8000000000000000>=n&&-1===(n+"").indexOf(".");default:return!1}}};J(dn,function(n,t){fn[t]=function(n,t){return function(r,u){return{test:function(i){var o=e(i,r);return n.call(t,o,u)}}}}(n,dn)});var vn={$:function(n,t,r){Y("$ not implemented")},$elemMatch:function(n,t,r){var u=e(n,r),i=new en.Query(t);if(!S(u)&&M(u))for(var o=0;o<u.length;o++)if(i.test(u[o]))return[u[o]]},$slice:function(n,t,r){var u=e(n,r);return M(u)?M(t)?nn(u,t[0],t[1]):w(t)?nn(u,t):void Y("Invalid argument type for $slice projection operator"):u},$stdDevPop:function(n,t,r){var e=m(n,t,r);return Z({dataset:e,sampled:!1})},$stdDevSamp:function(n,t,r){var e=m(n,t,r);return Z({dataset:e,sampled:!0})}},pn={$addToSet:function(n,t){return X(this.$push(n,t))},$sum:function(n,t){return M(n)?w(t)?n.length*t:this.$push(n,t).filter(w).reduce(function(n,t){return n+t},0):0},$max:function(n,t){var r,e=this.$push(n,t);return e.length>0&&(r=e[0],J(e,function(n){n>r&&(r=n)})),r},$min:function(n,t){var r,e=this.$push(n,t);return e.length>0&&(r=e[0],J(e,function(n){r>n&&(r=n)})),r},$avg:function(n,t){var r=this.$push(n,t).filter(w),e=r.reduce(function(n,t){return n+t},0);return e/(r.length||1)},$push:function(n,t){return D(t)?l(n):n.map(function(n){return m(n,t,null)})},$first:function(n,t){return n.length>0?m(n[0],t):void 0},$last:function(n,t){return n.length>0?m(n[n.length-1],t):void 0},$stdDevPop:function(n,t){var r=this.$push(n,t).filter(w);return Z({dataset:r,sampled:!1})},$stdDevSamp:function(n,t){var r=this.$push(n,t).filter(w);return Z({dataset:r,sampled:!0})}},gn={$abs:function(n,t){var r=m(n,t,null);return null===r||void 0===r?null:Math.abs(r)},$add:function(n,t){var r=m(n,t,null);return r.reduce(function(n,t){return n+t},0)},$ceil:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r),"$ceil must be a valid expression that resolves to a number."),Math.ceil(r))},$divide:function(n,t){var r=m(n,t,null);return r[0]/r[1]},$exp:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r),"$exp must be a valid expression that resolves to a number."),Math.exp(r))},$floor:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r),"$floor must be a valid expression that resolves to a number."),Math.floor(r))},$ln:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r),"$ln must be a valid expression that resolves to a number."),Math.log(r))},$log:function(n,t){var r=m(n,t,null);return b(M(r)&&2===r.length,"$log must be a valid expression that resolves to an array of 2 items"),r.some(isNaN)?NaN:r.some(D)?null:(b(r.every(w),"$log expression must resolve to array of 2 numbers"),Math.log10(r[0])/Math.log10(r[1]))},$log10:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r),"$log10 must be a valid expression that resolves to a number."),Math.log10(r))},$mod:function(n,t){var r=m(n,t,null);return r[0]%r[1]},$multiply:function(n,t){var r=m(n,t,null);return r.reduce(function(n,t){return n*t},1)},$pow:function(n,t){var r=m(n,t,null);return b(M(r)&&2===r.length&&r.every(w),"$pow must be a valid expression that resolves to an array of 2 numbers"),0===r[0]&&r[1]<0&&Y("$pow cannot raise 0 to a negative exponent"),Math.pow(r[0],r[1])},$sqrt:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r)&&r>0,"$sqrt must be a valid expression that resolves to a non-negative number."),Math.sqrt(r))},$subtract:function(n,t){var r=m(n,t,null);return r[0]-r[1]},$trunc:function(n,t){var r=m(n,t,null);return isNaN(r)?NaN:D(r)?null:(b(w(r)&&r>0,"$trunc must be a valid expression that resolves to a non-negative number."),Math.trunc(r))}},$n={$concat:function(n,t){var r=m(n,t,null);return[null,void 0].some(Q.bind(null,r))?null:r.join("")},$indexOfBytes:function(n,t){var r=m(n,t,null);if(D(r[0]))return null;b(N(r[0]),"$indexOfBytes first operand must resolve to a string"),b(N(r[1]),"$indexOfBytes second operand must resolve to a string");var e=r[0],u=r[1],i=r[2],o=r[3];if(b(S(i)||w(i)&&i>=0&&Math.round(i)===i,"$indexOfBytes third operand must resolve to a non-negative integer"),i=i||0,b(S(o)||w(o)&&o>=0&&Math.round(o)===o,"$indexOfBytes fourth operand must resolve to a non-negative integer"),o=o||e.length,i>o)return-1;var a=e.substring(i,o).indexOf(u);return a>-1?a+i:a},$split:function(n,t){var r=m(n,t,null);return b(N(r[0]),"$split requires an expression that evaluates to a string as a first argument, found: "+B(r[0])),b(N(r[1]),"$split requires an expression that evaluates to a string as a second argument, found: "+B(r[1])),r[0].split(r[1])},$strcasecmp:function(n,t){var r=m(n,t,null);return r[0]=U(r[0])?"":r[0].toUpperCase(),r[1]=U(r[1])?"":r[1].toUpperCase(),r[0]>r[1]?1:r[0]<r[1]?-1:0},$substr:function(n,t){var r=m(n,t,null);return N(r[0])?r[1]<0?"":r[2]<0?r[0].substr(r[1]):r[0].substr(r[1],r[2]):""},$toLower:function(n,t){var r=m(n,t,null);return U(r)?"":r.toLowerCase()},$toUpper:function(n,t){var r=m(n,t,null);return U(r)?"":r.toUpperCase()}},yn={$dayOfYear:function(n,t){var r=m(n,t,null);if(I(r)){var e=new Date(r.getFullYear(),0,0),u=r-e,i=864e5;return Math.round(u/i)}},$dayOfMonth:function(n,t){var r=m(n,t,null);return I(r)?r.getDate():void 0},$dayOfWeek:function(n,t){var r=m(n,t,null);return I(r)?r.getDay()+1:void 0},$year:function(n,t){var r=m(n,t,null);return I(r)?r.getFullYear():void 0},$month:function(n,t){var r=m(n,t,null);return I(r)?r.getMonth()+1:void 0},$week:function(n,t){var r=m(n,t,null);r=new Date(+r),r.setHours(0,0,0),r.setDate(r.getDate()+4-(r.getDay()||7));var e=new Date(r.getFullYear(),0,1);return Math.floor(((r-e)/864e5+1)/7)},$hour:function(n,t){var r=m(n,t,null);return I(r)?r.getUTCHours():void 0},$minute:function(n,t){var r=m(n,t,null);return I(r)?r.getMinutes():void 0},$second:function(n,t){var r=m(n,t,null);return I(r)?r.getSeconds():void 0},$millisecond:function(n,t){var r=m(n,t,null);return I(r)?r.getMilliseconds():void 0},$dateToString:function(n,t){for(var r=t.format,e=m(n,t.date,null),u=r.match(/(%%|%Y|%m|%d|%H|%M|%S|%L|%j|%w|%U)/g),i=0,o=u.length;o>i;i++){var a=Qn[u[i]],l=a;if(M(a)){var s=this[a[0]],c=a[1];l=h(s.call(this,n,e),c)}r=r.replace(u[i],l)}return r}},mn={$setEquals:function(n,t){var r=m(n,t,null),e=X(r[0]),u=X(r[1]);return e.length===u.length&&e.length===H(e,u).length},$setIntersection:function(n,t){var r=m(n,t,null);return H(r[0],r[1])},$setDifference:function(n,t){var r=m(n,t,null);return r[0].filter(P.bind(null,r[1]))},$setUnion:function(n,t){var r=m(n,t,null);return K(r[0],r[1])},$setIsSubset:function(n,t){var r=m(n,t,null);return H(r[0],r[1]).length===r[0].length},$anyElementTrue:function(n,t){var r=m(n,t,null)[0];return r.some(R)},$allElementsTrue:function(n,t){var r=m(n,t,null)[0];return r.every(R)}},bn={$cond:function(n,t){var r,e,u;M(t)?(3!==t.length&&Y("Invalid arguments for $cond operator"),r=t[0],e=t[1],u=t[2]):k(t)&&(r=t["if"],e=t.then,u=t["else"]);var i=m(n,r,null);return i?m(n,e,null):m(n,u,null)},$switch:function(n,t){t.branches||Y("Invalid arguments for $switch operator");var r=t.branches.find(function(t){return t["case"]&&t.then||Y("Invalid arguments for $switch operator"),m(n,t["case"],null)});return r?m(n,r.then,null):t["default"]?m(n,t["default"],null):void Y("Invalid arguments for $switch operator")},$ifNull:function(n,t){b(M(t)&&2===t.length,"Invalid arguments for $ifNull operator");var r=m(n,t,null);return null===r[0]||void 0===r[0]?r[1]:r[0]}},xn={$cmp:function(n,t){var r=m(n,t,null);return r[0]>r[1]?1:r[0]<r[1]?-1:0}};J(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"],function(n){xn[n]=function(t,r){var e=m(t,r,null);return dn[n](e[0],e[1])}});var On={$arrayElemAt:function(n,t){var r=m(n,t,null);b(M(r)&&2===r.length,"$arrayElemAt expression must resolve to an array of 2 elements"),b(M(r[0]),"First operand to $arrayElemAt must resolve to an array"),b(w(r[1]),"Second operand to $arrayElemAt must resolve to an integer");var e=r[1];return r=r[0],0>e&&Math.abs(e)<=r.length?r[e+r.length]:e>=0&&e<r.length?r[e]:void 0},$concatArrays:function(n,t){var r=m(n,t,null);return b(M(r)&&2===r.length,"$concatArrays expression must resolve to an array of 2 elements"),r.some(D)?null:r[0].concat(r[1])},$filter:function(n,t){var r=m(n,t.input,null),e=t.as,u=t.cond;return b(M(r),"'input' expression for $filter must resolve to an array"),r.filter(function(n){var t={};return t["$"+e]=n,m(t,u,null)===!0})},$indexOfArray:function(n,t){var r=m(n,t,null);if(D(r))return null;var e=r[0];if(D(e))return null;b(M(e),"First operand for $indexOfArray must resolve to an array.");var u=r[1];if(D(u))return null;var i=r[2]||0,o=r[3]||e.length;return o<e.length&&(e=e.slice(i,o)),e.indexOf(u,i)},$isArray:function(n,t){return M(m(n,t,null))},$range:function(n,t){for(var r=m(n,t,null),e=r[0],u=r[1],i=r[2]||1,o=[];u>e&&i>0||e>u&&0>i;)o.push(e),e+=i;return o},$reverseArray:function(n,t){var r=m(n,t,null);return D(r)?null:(b(M(r),"$reverseArray expression must resolve to an array"),r=l(r),r.reverse(),r)},$reduce:function(n,t){var r=m(n,t.input,null),e=m(n,t.initialValue,null),u=t["in"];return D(r)?null:(b(M(r),"'input' expression for $reduce must resolve to an array"),r.reduce(function(n,t){return m({$value:n,$this:t},u,null)},e))},$size:function(n,t){var r=m(n,t,null);return M(r)?r.length:void 0},$slice:function(n,t){var r=m(n,t,null);return nn(l(r[0]),r[1],r[2])},$zip:function(n,t){var r=m(n,t.inputs,null),e=t.useLongestLength||!1;b(M(r),"'inputs' expression must resolve to an array"),b(j(e),"'useLongestLength' must be a boolean"),M(t.defaults)&&b(R(e),"'useLongestLength' must be set to true to use 'defaults'");var u,i,o=0;for(i=0;i<r.length;i++){if(u=r[i],D(u))return null;b(M(u),"'inputs' expression values must resolve to an array or null"),o=e?Math.max(o,u.length):Math.min(o||u.length,u.length)}var a=[],l=t.defaults||[];for(i=0;o>i;i++)u=r.map(function(n,t){return D(n[i])?l[t]||null:n[i]}),a.push(u);return a}},_n={$literal:function(n,t){return t}},jn={$map:function(n,t){var r=m(n,t.input,null);M(r)||Y("Input expression for $map must resolve to an array");var e=t.as,u=t["in"],i="$"+e,o=n[i];return r.map(function(t){n[i]=t;var r=m(n,u,null);return S(o)?delete n[i]:n[i]=o,r})},$let:function(n,t){var r=t.vars,e=t["in"],u={},i=z(r);J(i,function(t){var e=m(n,r[t],null),i="$"+t;u[i]=n[i],n[i]=e});var o=m(n,e,null);return J(i,function(t){var r="$"+t;S(u[r])?delete n[r]:n[r]=u[r]}),o}},Nn={$and:function(n,t){var r=m(n,t,null);return R(r)&&r.every(R)},$or:function(n,t){var r=m(n,t,null);return R(r)&&r.some(R)},$not:function(n,t){return!m(n,t[0],null)}},wn=Object.assign({},On,gn,Nn,xn,bn,yn,_n,mn,$n,jn),Mn={$$ROOT:function(n,t,r){return r.root},$$CURRENT:function(n,t,r){return n}},kn={$$KEEP:function(n,t,r){return n},$$PRUNE:function(n,t,r){},$$DESCEND:function(n,r,e){if(!T(r,"$cond"))return n;var u;return J(n,function(i,o){A(i)&&(M(i)?(u=[],J(i,function(n,i){k(n)&&(n=t(n,r,e)),S(n)||u.push(n)})):u=t(i,r,e),S(u)?delete n[o]:n[o]=u)}),n}},An=z(Mn),In=z(kn),En=en.OP_QUERY="query",Cn=en.OP_GROUP="group",qn=en.OP_AGGREGATE="aggregate",Sn=en.OP_PIPELINE="pipeline",Dn=en.OP_PROJECTION="projection",Pn={aggregate:wn,group:pn,pipeline:cn,projection:vn,query:fn},Qn={"%Y":["$year",4],"%m":["$month",2],"%d":["$dayOfMonth",2],"%H":["$hour",2],"%M":["$minute",2],"%S":["$second",2],"%L":["$millisecond",3],"%j":["$dayOfYear",3],"%w":["$dayOfWeek",1],"%U":["$week",2],"%%":"%"},Rn=[N,j,w,I,D,E];en.VERSION=rn}(this); | ||
//# sourceMappingURL=dist/mingo.min.map |
{ | ||
"name": "mingo", | ||
"version": "0.9.1", | ||
"version": "1.0.0", | ||
"description": "JavaScript implementation of MongoDB query language", | ||
@@ -5,0 +5,0 @@ "main": "mingo.js", |
@@ -21,28 +21,27 @@ # Mingo | ||
- Query and Projection Operators | ||
- Array Operators (`$all`, `$elemMatch`, `$size`) | ||
- Comparisons Operators (`$gt`, `$gte`, `$lt`, `$lte`, `$ne`, `$nin`, `$in`) | ||
- Element Operators (`$exists`, `$type`) | ||
- Evaluation Operators (`$regex`, `$mod`, `$where`) | ||
- Logical Operators (`$and`, `$or`, `$nor`, `$not`) | ||
- [Array Operators](https://docs.mongodb.com/manual/reference/operator/query-array/) | ||
- [Comparisons Operators](https://docs.mongodb.com/manual/reference/operator/query-comparison/) | ||
- [Element Operators](https://docs.mongodb.com/manual/reference/operator/query-element/) | ||
- [Evaluation Operators](https://docs.mongodb.com/manual/reference/operator/query-evaluation/) | ||
- [Logical Operators](https://docs.mongodb.com/manual/reference/operator/query-logical/) | ||
- Aggregation Framework Operators | ||
- Pipeline Operators (`$group`,`$match`,`$project`,`$sort`,`$limit`,`$unwind`,`$skip`,`$count`,`$replaceRoot`,`$redact`,`$sample`,`$sortByCount`,`$addFields`) | ||
- Group Operators (`$addToSet`, `$sum`, `$max`, `$min`, `$avg`, `$push`, `$first`, `$last`) | ||
- Projection Operators (`$elemMatch`, `$slice`) | ||
- Arithmetic Operators (`$add`, `$divide`, `$mod`, `$multiply`, `$subtract`) | ||
- Array Operators (`$size`) | ||
- Boolean Operators (`$and`, `$or`, `$not`) | ||
- Comparisons Operators (`$cmp`, `$gt`, `$gte`, `$lt`, `$lte`, `$ne`, `$nin`, `$in`) | ||
- Conditional Operators (`$cond`, `$switch`, `$ifNull`) | ||
- Date Operators | ||
(`$dayOfYear`, `$dayOfMonth`, `$dayOfWeek`, `$year`, `$month`, `$week`, `$hour`, `$minute`, `$second`, `$millisecond`, `$dateToString`) | ||
- Literal Operators (`$literal`) | ||
- Set Operators | ||
(`$setEquals`, `$setIntersection`, `$setDifference`, `$setUnion`, `$setIsSubset`, `$anyElementTrue`, `$allElementsTrue`) | ||
- String Operators (`$strcasecmp`, `$concat`, `$substr`, `$toLower`, `$toUpper`) | ||
- Variable Operators (`$map`, `$let`) | ||
- Support for custom operators | ||
- BackboneJS Integration | ||
- [Pipeline Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/) | ||
- [Group Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-group/) | ||
- [Projection Operators](https://docs.mongodb.com/manual/reference/operator/projection/) | ||
- [Arithmetic Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-arithmetic/) | ||
- [Array Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-array/) | ||
- [Boolean Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-boolean/) | ||
- [Comparisons Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-comparison/) | ||
- [Conditional Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-conditional/) | ||
- [Date Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-date/) | ||
- [Literal Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-literal/) | ||
- [Set Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-set/) | ||
- [String Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-string/) | ||
- [Variable Operators](https://docs.mongodb.com/manual/reference/operator/aggregation-projection/) | ||
- Support for adding custom operators | ||
- Match against user-defined types | ||
- Support for system variables (`$$ROOT`,`$$CURRENT`,`$$DESCEND`,`$$PRUNE`,`$$KEEP`) | ||
- JSON stream filtering and projection. *NodeJS only* | ||
- Support for aggregaion variables | ||
- [`$$ROOT`,`$$CURRENT`,`$$DESCEND`,`$$PRUNE`,`$$KEEP`](https://docs.mongodb.com/manual/reference/aggregation-variables/) | ||
- Support integrating with custom collections via mixin | ||
- Query filter and projection streaming. See [mingo-stream](https://github.com/kofrasa/mingo-stream) | ||
@@ -73,2 +72,4 @@ For documentation on using query operators see [mongodb](http://docs.mongodb.org/manual/reference/operator/query/) | ||
```js | ||
// `collection` is an Array of objects you want to query | ||
// filter collection with find() | ||
@@ -124,28 +125,8 @@ var cursor = query.find(collection); | ||
## Stream Filtering | ||
## Integration with custom collection | ||
```js | ||
var JSONStream = require('JSONStream'), | ||
fs = require('fs'), | ||
Mingo = require('mingo'); | ||
var query = new Mingo.Query({ | ||
scores: { $elemMatch: {type: "exam", score: {$gt: 90}} } | ||
}, {name: 1}); | ||
file = fs.createReadStream('./students.json'); | ||
var qs = query.stream(); | ||
qs.on('data', function (data) { | ||
console.log(data); // log filtered outputs | ||
// ex. { name: 'Dinah Sauve', _id: 49 } | ||
}); | ||
file.pipe(JSONStream.parse("*")).pipe(qs); | ||
``` | ||
## Backbone Integration | ||
```js | ||
// using with Backbone | ||
// using Backbone.Collection as an example (any user-defined object will do) | ||
var Grades = Backbone.Collection.extend(Mingo.CollectionMixin); | ||
// `collection` is an array of objects | ||
var grades = new Grades(collection); | ||
@@ -159,6 +140,8 @@ | ||
// print grade with the lowest score | ||
// return grade with the lowest score | ||
cursor.first(); | ||
``` | ||
The collection to mixin needs to provide a method with signature `toJSON() -> Array[Object]`. | ||
## Documentation | ||
@@ -165,0 +148,0 @@ - [API](https://github.com/kofrasa/mingo/wiki/API) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
196321
3325
1
0
152