1.2.2 • Published 4 years ago

feathers-statistic-mongoose v1.2.2

Weekly downloads
-
License
MIT
Repository
-
Last release
4 years ago

Statistic-mongoose

Build Status

Override Feathers service adapter (feathers-mongoose) for the Mongoose ORM.Additional querying syntax for create times series data . An object modeling tool for MongoDB

With npm

$ npm install --save statistic-mongoose

With yarn

$ yarn add statistic-mongoose

Important: statistic-mongoose implements the Feathers Common database adapter API and querying syntax.

This adapter also requires a running MongoDB database server.

SETUP

This version just support for (feathers-mongoose) v6.3.0

You can refer to my package.json:

"dependencies": {
    "@feathersjs/commons": "^1.3.0",
    "@feathersjs/errors": "^3.3.4",
    "lodash.omit": "^4.5.0",
    "uberproto": "^2.0.4"
},
"devDependencies": {
    "@feathersjs/express": "^1.2.7",
    "@feathersjs/feathers": "^3.2.3",
    "@feathersjs/socketio": "^3.2.7",
    "feathers-mongoose": "^6.3.0",
    "body-parser": "^1.18.3",
    "chai": "^4.2.0",
    "feathers-service-tests": "^0.10.2",
    "istanbul": "^1.1.0-alpha.1",
    "mocha": "^5.2.0",
    "mongoose": "^5.3.0",
    "semistandard": "^13.0.1",
    "sinon-chai": "^3.3.0",
    "sinon": "^7.1.1"
}

API

service(options)

Returns a new service instance initialized with the given options. Model has to be a Mongoose model. See the Mongoose Guide for more information on defining your model.

const mongoose = require('mongoose');
const createService = require('statistic-mongoose');

// A module that exports your Mongoose model
const Model = require('./models/message');

// Make Mongoose use the ES6 promise
mongoose.Promise = global.Promise;

// Connect to a local database called `feathers`
mongoose.connect('mongodb://localhost:27017/feathers');

app.use('/messages', createService({ Model }));
app.use('/messages', createService({ Model, lean, id, events, paginate }));

Read feathers-mongoose docs for more.

Example

Here's a complete example of a Feathers server with a statistic Mongoose service, I'm using @feathers/cli v3.2.0 for this example.

In statistic.model.js:

module.exports = function (app) {
  const mongooseClient = app.get('mongooseClient');
  const { Schema } = mongooseClient;
  const statistic = new Schema({
    number: { type: Number, unique: true },
    createdOn: { type: Date, unique: true, 'default': Date.now }
  }, {
    timestamps: true
  });

  return mongooseClient.model('statistic', statistic);

I'm create 50 million documents for this example. You can see how to create a quick 50m record here.

In statistic.service.js:

const createService = require('statistic-mongoose');
const createModel = require('../../models/statistic.model');
const hooks = require('./statistic.hooks');

module.exports = function (app) {
  const Model = createModel(app);
  const paginate = app.get('paginate');

  const options = {
    name: 'statistic',
    Model,
    paginate
  };

  // Initialize our service with any options it requires
  app.use('/statistic', createService(options));
 
  // Get our initialized service so that we can register hooks and filters
  const service = app.service('statistic');

  service.hooks(hooks);
};

Querying, Validation

You can see some basic Feathers querying here. I added a few queries by override feathers-mongoose module.

$statistic

$statistic will return average value of the intervals

//Get 100 average values following createdOn field
app.service('statistic').find({
  query: {
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?$statistic=100&averageBy=number&sortBy=createdOn

Options:

  • averageBy (required) - The field you need to statistical
  • sortBy ((required)) - The field dependent values

Important: $statistic will not support paging . You need to add fields averageBy and sortBy to access $statistic query.

Combine with other queries

$limit

$limit will Limited number of records

//Get 100 average values of 1000 records following createdOn field
app.service('statistic').find({
  query: {
    $limit: 1000,
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?$limit=1000&$statistic=100&averageBy=number&sortBy=createdOn

$skip

$skip will skip values sort by query field

//Get 100 average values of createdOn field, skip 10 first record
app.service('statistic').find({
  query: {
    $skip: 10,
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?$skip=1000&$statistic=100&averageBy=number&sortBy=createdOn

$lt, $lte

Find all records where the value is less ($lt) or less and equal ($lte) to a given value for statistic analys.

//Get 100 average values of values less then 10000
app.service('statistic').find({
  query: {
    number: {
      $lt: 10000
    }
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?number[$lt]=10000&$statistic=100&averageBy=number&sortBy=createdOn

$gt, $gte

Find all records where the value is more ($gt) or more and equal ($gte) to a given value.

//Get 100 average values of values more then 10000
app.service('statistic').find({
  query: {
    number: {
      $gt: 10000
    }
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?number[$gt]=10000&$statistic=100&averageBy=number&sortBy=createdOn

$in, $nin

Find all records where the property does ($in) or does not ($nin) match any of the given values.

//Find 100 average values in room 10 or 100000
app.service('statistic').find({
  query: {
    number: {
      $in: [ 10, 100000 ]
    }
    $statistic: 100,
    averageBy: number,
    sortBy: createdOn
  }
})

GET /statistic?number[$in]=10&number[$in]=100000&$statistic=100&averageBy=number&sortBy=createdOn

License

MIT

Authors