🚀 DAY 5 OF LAUNCH WEEK:Introducing Webhook Events for Alert Changes.Learn more →
Socket
Book a DemoInstallSign in
Socket

mongoose-api-helpers

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mongoose-api-helpers

Advanced query filtering, pagination, search and population for MongoDB with Mongoose

latest
Source
npmnpm
Version
1.0.4
Version published
Maintainers
1
Created
Source

Features

  • Advanced Filtering: Support for gte, gt, lte, lt, in, nin, eq, ne, regex operators.
  • Full-Text Search: Easily integrate search functionality across specified fields.
  • Sorting: Order results by one or more fields, ascending or descending.
  • Field Limiting: Select specific fields to return, reducing payload size.
  • Pagination: Efficiently handle large datasets with page and limit parameters.
  • Population: Seamlessly populate related Mongoose documents.
  • TypeScript Support: Built with TypeScript for a better developer experience.
  • Minimal Dependencies: Lightweight and focused on core functionality.

Installation

You can install the package using npm:

npm install mongoose-api-helpers

## Usage

### Basic Usage

Import the necessary functions and integrate them into your Mongoose queries.

```javascript
// For CommonJS
const { ApiFeatures, getPagination } = require("mongoose-api-helpers");

// For ES6 Modules / TypeScript
import { ApiFeatures, getPagination } from "mongoose-api-helpers";

// In your controller (example using Express.js)
// Assuming 'Product' is a Mongoose Model and 'req.query' contains your API query parameters.
export const getProducts = async (req, res) => {
  try {
    const features = new ApiFeatures(Product.find(), req.query)
      .filter()
      .search() // Searches default fields if not specified, or all string fields
      .sort()
      .limitFields()
      .paginate()
      .populate(); // Populates all specified in model schema virtuals by default

    const results = await features.query;
    const total = features.total || (await Product.countDocuments()); // Fallback to countDocuments if total is not set by paginate
    const limit = parseInt(req.query.limit) || 10;
    const page = parseInt(req.query.page) || 1;

    res.status(200).json({
      success: true,
      count: results.length,
      pagination: getPagination(total, limit, page),
      data: results,
    });
  } catch (error) {
    console.error(error); // Log the error for debugging
    res.status(500).json({
      success: false,
      message: "Server Error",
      error: error.message, // Provide error message for client
    });
  }
};
```

### Advanced Usage with Customization

Customize search fields and populate options for fine-grained control.

```typescript
import { ApiFeatures, getPagination } from "mongoose-api-helpers";
import { Request, Response } from "express";
import Product from "../models/Product"; // Your Mongoose Product Model

export const getProductsAdvanced = async (req: Request, res: Response) => {
  try {
    const features = new ApiFeatures(Product.find(), req.query)
      .filter()
      .search(["name", "description", "brand"]) // Custom search fields
      .sort()
      .limitFields()
      .paginate()
      .populate(["category", "reviews"]); // Custom populate options

    const products = await features.query;
    const total = features.total || (await Product.countDocuments());
    const limit = parseInt(req.query.limit as string) || 10;
    const page = parseInt(req.query.page as string) || 1;

    res.status(200).json({
      success: true,
      count: products.length,
      pagination: getPagination(total, limit, page),
      data: products,
    });
  } catch (error: any) {
    // Type 'any' for error for simpler example, consider specific error types
    console.error(error);
    res.status(500).json({
      success: false,
      message: "Server Error",
      error: error.message,
    });
  }
};
```

### API Response with Pagination

The `getPagination` function helps format the pagination metadata for your API responses.

```json
{
  "success": true,
  "count": 10,
  "pagination": {
    "total": 100,
    "pages": 10,
    "currentPage": 1,
    "limit": 10,
    "hasNext": true,
    "hasPrevious": false,
    "nextPage": 2,
    "previousPage": null
  },
  "data": [
    // Array of product objects
  ]
}
```

## API Reference

### `ApiFeatures` Class

#### `constructor(query: mongoose.Query, queryString: object)`

- `query`: A Mongoose query object (e.g., `Model.find()`).
- `queryString`: The request query parameters object (e.g., `req.query` from Express).

#### Methods

All methods are chainable and modify the internal `query` object.

- `filter(): this`
  Applies advanced filtering based on query parameters. Supports operators like `[gte]`, `[gt]`, `[lte]`, `[lt]`, `[in]`, `[nin]`, `[eq]`, `[ne]`, `[regex]`.
- `search(searchFields?: string[]): this`
  Implements search functionality.
  - `searchFields` (optional): An array of strings specifying which fields to search within. If not provided, it attempts to search across all string fields in the model.
- `sort(): this`
  Handles sorting of results based on the `sort` query parameter.
- `limitFields(): this`
  Limits the fields returned in the query results based on the `fields` query parameter.
- `paginate(): this`
  Implements pagination based on `page` and `limit` query parameters. Sets `this.total` for convenience.
- `populate(populateOptions?: string | string[] | mongoose.PopulateOptions | mongoose.PopulateOptions[]): this`
  Handles population of related Mongoose documents.
  - `populateOptions` (optional): Can be a string (field name), an array of strings, or Mongoose `PopulateOptions` object(s).

#### Properties

- `query: mongoose.Query`
  The modified Mongoose query object after all chained methods have been applied.
- `total?: number`
  The total number of documents found _before_ pagination, if `paginate()` was called.

### `getPagination(total: number, limit: number, page: number): object`

A helper function to generate pagination metadata for your API responses.

- `total`: The total number of documents available.
- `limit`: The maximum number of results per page.
- `page`: The current page number.

Returns an object with `total`, `pages`, `currentPage`, `limit`, `hasNext`, `hasPrevious`, `nextPage`, and `previousPage` properties.

## Query Parameters

The package understands and processes the following query parameters:

- `page`: The desired page number (e.g., `page=2`).
- `limit`: The number of results per page (e.g., `limit=10`).
- `sort`: Fields to sort by, comma-separated. Prefix with `-` for descending order (e.g., `sort=-price,createdAt`).
- `fields`: Fields to return, comma-separated (e.g., `fields=name,price,category`).
- `search`: The search term to apply (e.g., `search=apple`).
- `populate`: Fields to populate, comma-separated (e.g., `populate=category,reviews`).
- **Filter operators**: For any field, you can use `[gte]`, `[gt]`, `[lte]`, `[lt]`, `[in]`, `[nin]`, `[eq]`, `[ne]`, `[regex]`.

## Examples

### Filtering

Fetch products with a price between 100 and 500, and belonging to the 'electronics' category.

```text
GET /api/products?price[gte]=100&price[lte]=500&category=electronics
```

### Searching

Search for products containing the term 'apple' in their searchable fields.

```text
GET /api/products?search=apple
```

### Sorting

Sort products by price (descending) and then by creation date (ascending).

```text
GET /api/products?sort=-price,createdAt
```

### Field Selection

Return only the `name`, `price`, and `category` fields for each product.

```text
GET /api/products?fields=name,price,category
```

### Pagination

Get the second page of results, with 10 items per page.

```text
GET /api/products?page=2&limit=10
```

### Population

Populate the `category` and `reviews` fields of each product.

```text
GET /api/products?populate=category,reviews
```

## TypeScript Support

This package is written in TypeScript and provides full type definitions out-of-the-box, ensuring a great development experience with type checking and autocompletion.

## Contribution

Contributions are welcome! If you find a bug or have a feature request, please open an issue. If you'd like to contribute code, please follow these guidelines:

1.  Fork the repository.
2.  Create a new branch for your feature or bug fix.
3.  Ensure your code adheres to the existing style.
4.  Write tests for your changes.
5.  Follow the [Git Commit Messages](#git-commit-messages) convention.
6.  Submit a pull request.

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

```

Here's an image that symbolizes a well-documented and robust API feature package, perfect for a README file. It includes elements like code, a magnifying glass for searching/filtering, and pagination symbols.

```

Keywords

mongoose

FAQs

Package last updated on 31 Aug 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts