mongoose-find-as-string
is a Mongoose plugin that enables you to search on every property as string, that means it searches on non-text field types as Dates, Booleans, etc.
Motivation:
- Date Use Case: let's say a user enters
2017
one option is to start searching the Date field using$gt
and$lt
for that period. But what happens when a user searches for20
that can match years, months, days, hours, etc. - Number Use Case: a user wants to search all numeric fields as string, in example
20
shuould match 200, 320, etc. - Boolean Use Case: a user wants to search
tr
and is trying to matchtrue
.
If text indexes, virtual props and extensive aggreate pipelines are giving you a headhache: this plugin is just for you.
npm install mongoose-find-as-string --save
This plugin must first be added to a schema:
const mongoosefindAsString = require('mongoose-find-as-string');
sampleSchema.plugin(mongoosefindAsString);
SampleModel
will have a new function called findAsString
(e.g. SampleModel.findAsString()
).
Let's say we have the following schema definition:
const mongoose = require('mongoose');
const mongoosefindAsString = require('mongoose-find-as-string');
const Schema = mongoose.Schema;
const sampleSchema = new Schema({
name : String,
qty : { type: Number, default: 100 },
live : { type: Boolean, default: true },
startDate : Date,
});
// Add the plugin
sampleSchema.plugin(mongooseFindAsString);
// Export module
const SampleModel = mongoose.model('Sample', sampleSchema);
// Create a sample document and persist it
mongoose.connect('mongodb://localhost/sample-test');
const sample = new SampleModel({
name: 'John Doe',
qty: 55,
startDate: new Date(2017, 4, 20),
live: false,
});
sample.save();
You can find number as string:
SampleModel.findAsString({
name: 'doe',
qty: '5',
startDate: '2017',
live: 'fals',
}).exec((err, docs) => {
// docs:
// [ { _id: 59cdcf3528426e6b4e64e345,
// name: 'John Doe',
// startDate: 2017-05-20T03:00:00.000Z,
// live: false,
// __v: 0 } ]
});