0.8.0 • Published 2 months ago

mongoose-query v0.8.0

Weekly downloads
65
License
MIT
Repository
github
Last release
2 months ago

mongoose-query

Build Status JavaScript Style Guide License badge release npm version Stars badge

This library is usefull example with expressjs + mongoose applications to help construct mongoose query model directly from url parameters. Example:

http://localhost/model?q={"group":"users"}&f=name&sk=1&l=5&p=name

Converted to:

model.find({group: "users"}).select("name").skip(1).limit(5).populate('name')

Tested with node.js versions

12.x, 14.x, 16.x,latest release

Changes log

See releases page.

Installation

Use npm:

npm install mongoose-query

Test

npm test && npm run lint

Usage Example

var QueryPlugin = require(mongoose-query);
var TestSchema = new mongoose.Schema({});
TestSchema.plugin(QueryPlugin);
var testmodel = mongoose.model('test', TestSchema);

//express route
module.exports = function query(req, res) {
  testmodel.query(req.query, function(error, data){
    res.json(error?{error: error}:data);
  });
}

doc

var QueryPlugin = require(mongoose-query);
schema.plugin( QueryPlugin(, <options>) )

optional options:

  • logger: custom logger, e.g. winston logger, default: "dummy logger"
  • includeAllParams: Parse also other values. e.g. ?name=me. default: true
  • ignoreKeys : <array{String}> keys to be ignored. Default: []

Model static methods:

model.query( <query>(, <callback>) )

model.leanQuery(<query>(, <callback>) ): gives plain objects (lean)

Note: without <callback> you get Promise.

URL API:

http://www.myserver.com/query?[q=<query>][&t=<type>][&f=<fields>][&s=<order>][&sk=<skip>]
[&l=<limit>][&p=<populate>][&fl=<boolean>][&map=<mapFunction>][&reduce=<reduceFunction>]

q=<query>                   restrict results by the specified JSON query
                            regex e.g. q='{"field":{"$regex":"/mygrep/", "$options":"i"}}'
t=<type>                    find|findOne|count|estimateCount|aggregate|distinct|aggregate|mapReduce
f=<set of fields>           specify the set of fields to include or exclude in each document
                            (1 - include; 0 - exclude)
s=<sort order>              specify the order in which to sort each specified field
                            (1- ascending; -1 - descending), JSON
sk=<num results to skip>    specify the number of results to skip in the result set;
                            useful for paging
l=<limit>                   specify the limit for the number of results (default is 1000)
p=<populate>                specify the fields for populate, also more complex json object is supported.
x=<explain>                 allowed values: 'queryPlanner', 'executionStats', 'allPlansExecution'
to=<ms>                     timeout for query
d=<boolean>                 allowDiskUse (for heavy queries)
map=<mapFunction>           mongodb map function as string
                            http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-map-cmd'
                            e.g. "function(){if (this.status == 'A') emit(this.cust_id, 1);)}"
reduce=<reduceFunction>     mongodb reduce function as string
                            http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-reduce-cmd
                            e.g. "function(key, values) {return result;}"
fl=<boolean>                Flat results or not

Special values:
"oid:<string>"              string is converted to ObjectId
"/regex/(options)"          converted to regex
{ $regex: /<string>/,       regex match with optional regex options
 ($options: "") }        

Alternative search conditions:
"key={i}a"                  case insensitive
"key={e}a"                  ends with a
"key={ei}a"                 ends with a, case insensitive
"key={b}a"                  begins with a
"key={bi}a"                 begins with a, case insensitive
"key={in}a,b"               At least one of these is in array
"key={nin}a,b"              Any of these values is not in array
"key={all}a,b"              All of these contains in array
"key={empty}"               Field is empty or not exists
"key={!empty}"              Field exists and is not empty
"key={mod}a,b"              Docs where key mod a is b
"key={gt}a"                 value is greater than a
"key={gte}a"                value is greater or equal than a
"key={lt}a"                 value is lower than a
"key={lte}a"                value is lower or equal
"key={ne}a"                 value is not equal
"key={size}a"               value is array, and array size is a
"key={sort_by}"             sort by asc
"key={sort_by}-1"           sort by desc

**References to mongo:**
- [elemMatch](https://docs.mongodb.com/manual/reference/operator/query/elemMatch/)
- [size](https://docs.mongodb.com/manual/reference/operator/query/size/)

Results with fl=false:

[
 {
 	nest: {
    ed: {
      data: 'value',
      data2':'value'
    }
  }
}
]

Results with fl=true:

[
 {'nest.ed.data': 'value',
  'nest.ed.data2':'value'},
]

Date

Allowed date formats:

  • 2010/10/1 (y/m/d)
  • 31/2/2010 (d/m/y)
  • 2011-10-10T14:48:00 (ISO 8601)

Note: Only valid format is ISO when using date inside q -parameter.

0.8.0

2 months ago

0.7.5

8 months ago

0.7.4

2 years ago

0.7.3

3 years ago

0.6.1

5 years ago

0.6.0

5 years ago

0.5.3

6 years ago

0.5.2

6 years ago

0.5.1

7 years ago

0.5.0

7 years ago

0.4.0

7 years ago

0.3.0

7 years ago

0.2.1

7 years ago

0.2.0

8 years ago

0.1.7

10 years ago

0.1.6

10 years ago

0.1.5

10 years ago

0.1.4

10 years ago

0.1.3

11 years ago

0.1.2

11 years ago

0.1.1

11 years ago

0.1.0

11 years ago