Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pierrecabriere/mongoose-subquery
mongoose-subquery provides a new operator to query on a reference document field
https://github.com/pierrecabriere/mongoose-subquery
mongoose plugin query reference subquery
Last synced: 4 days ago
JSON representation
mongoose-subquery provides a new operator to query on a reference document field
- Host: GitHub
- URL: https://github.com/pierrecabriere/mongoose-subquery
- Owner: pierrecabriere
- License: apache-2.0
- Created: 2019-07-11T20:54:14.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-08-30T22:31:19.000Z (about 1 year ago)
- Last Synced: 2024-10-14T07:58:19.951Z (about 1 month ago)
- Topics: mongoose, plugin, query, reference, subquery
- Language: TypeScript
- Homepage:
- Size: 119 KB
- Stars: 6
- Watchers: 2
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# mongoose-subquery
[![npm version](https://badge.fury.io/js/mongoose-subquery.svg)](https://badge.fury.io/js/mongoose-subquery)
**mongoose-subquery** provides a new `$subquery` operator to make a query on a reference document field.
# Installation
The `mongoose-subquery` module adds a method to decode $subquery operator in your queries. By default, the plugin bind this method with all pre middlewares to automatically decode the input payload.
However, you can configure the plugin to prevent binding some middlewares and then calling the `Query.decodeSubquery` function.```typescript
import mongooseSubquery from "mongoose-subquery";const schema = new mongoose.Schema({
...
});
schema.plugin(mongooseSubquery, { ...options });
```# Configuration
```typescript
interface MongooseSubqueryOptions {
beforeDecode?: (query: mongoose.Query, obj: object) => void | Promise;
initQuery?: (query: mongoose.Query, key: string, obj: object, modelName: string) => void | Promise;
resolve?: (subquery: mongoose.Query, query: mongoose.Query) => any | Promise;
bindHooks?: string[];
}const defaultOptions: MongooseSubqueryOptions = {
resolve: (subquery) => subquery.find(),
bindHooks: [
"count",
"countDocuments",
"deleteMany",
"deleteOne",
"estimatedDocumentCount",
"find",
"findOne",
"findOneAndDelete",
"findOneAndRemove",
"findOneAndReplace",
"findOneAndUpdate",
"remove",
"replaceOne",
"update",
"updateOne",
"updateMany",
],
};
```### beforeDecode
The `beforeDecode` function is executed when the initial query (with `$subquery` within conditions) is decoded
### initQuery
You can provide a `initQuery` function that will be called each time a new mongoose.Query is instantiate by mongoose-subquery
```typescript
schema.plugin(mongooseSubquery, {
initQuery: (query, key, obj, modelName) => {
console.log(`new query created on ${modelName} with conds ${query.getQuery()}`);
}
});
```### resolve
The `resolve` option allows you to override the default behavior that simply run a `subquery.find()`, for more complex operations
```typescript
schema.plugin(mongooseSubquery, {
resolve: async (subquery) => {
const countQuery = subquery.clone();
const count = await countQuery.estimatedDocumentCount();
if (count > 100) {
throw new Error(`This query returns too many docs`);
}
return await subquery.find();
}
});
```# Example
```typescript
const roleSchema = new Schema({
name: String,
admin: Boolean
});
const Role = mongoose.model('Role', roleSchema, 'Roles');const ruleSchema = new Schema({
role: { type: ObjectId, ref: 'Role' }
});
ruleSchema.plugin(require('mongoose-subquery'));
const Rule = mongoose.model('Rule', ruleSchema, 'Rules');Rule.find({ role: { $subquery: { admin: true } } });
```Will return all rules where the referenced role matches the subquery `{ admin: true }`