query-like-feathers
v1.0.1
Published
FeathersJS-style query interface for Mongoose models
Maintainers
Readme
QueryLikeFeathers
A lightweight adapter that wraps Mongoose models with a FeathersJS-style query interface.
Use $limit, $skip, $sort, and $select without installing FeathersJS.
Install
npm install query-like-feathersPeer dependency:
mongoose >=5.2.0
Quick Start
const mongoose = require('mongoose');
const adapter = require('query-like-feathers');
const User = mongoose.model('User', new mongoose.Schema({
name: String,
email: String,
age: Number,
status: { type: String, default: 'active' }
}));
const users = adapter(User);API
find(params?)
Returns a paginated list of documents.
const result = await users.find({
query: {
status: 'active',
age: { $gt: 20 },
$sort: { age: -1 },
$select: ['name', 'age'],
$limit: 10,
$skip: 0
}
});
// { total: 42, limit: 10, skip: 0, data: [...] }Query Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| $limit | number | Maximum number of documents to return |
| $skip | number | Number of documents to skip |
| $sort | object | Sort order ({ field: 1 } ascending, { field: -1 } descending) |
| $select | string[] | Fields to include |
All other keys are passed through as MongoDB filters.
findOne(idOrQuery)
Returns a single document, or undefined if not found.
// By ID
const user = await users.findOne('507f1f77bcf86cd799439011');
// By filter (internally uses $limit: 1)
const admin = await users.findOne({ role: 'admin', status: 'active' });get(id)
Returns a single document by ID. Throws an error if not found.
const user = await users.get('507f1f77bcf86cd799439011');create(data)
Creates a single document or multiple documents at once.
// Single
const user = await users.create({ name: 'Alice', age: 25 });
// Batch
const batch = await users.create([
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 }
]);patch(id, data, params?)
Partially updates documents using $set.
// Single by ID
const updated = await users.patch(userId, { name: 'New Name' });
// Bulk by query
const result = await users.patch(null, { status: 'archived' }, {
query: { status: 'inactive' }
});
// { total, limit, skip, data: [...] }remove(id, params?)
Removes documents.
// Single by ID — returns the removed document
const removed = await users.remove(userId);
// Bulk by query
const result = await users.remove(null, { query: { status: 'archived' } });
// { deletedCount: 5 }TypeScript
Generic types propagate from your Mongoose schema through all adapter methods.
import adapter from 'query-like-feathers';
import { model, Schema } from 'mongoose';
interface IUser {
name: string;
email: string;
age: number;
}
const User = model<IUser>('User', new Schema<IUser>({
name: String,
email: String,
age: Number
}));
const users = adapter(User);
// data: HydratedDocument<IUser>[]
const { data } = await users.find({ query: { age: { $gt: 20 } } });
// HydratedDocument<IUser> | undefined
const user = await users.findOne({ email: '[email protected]' });
// Pass string directly for ObjectId fields (auto-casted by Mongoose)
const found = await users.get('507f1f77bcf86cd799439011');TypeScript generics require Mongoose 6+. For Mongoose 5, install
@types/mongooseseparately.
License
MIT
