4.5.8. Data Model Database Index

In this chapter, you’ll learn how to define a database index on a data model.

Define Database Index on Property#

Use the index method on a property's definition to define a database index.

For example:

Code
1import { model } from "@medusajs/framework/utils"2
3const MyCustom = model.define("my_custom", {4  id: model.id().primaryKey(),5  name: model.text().index(6    "IDX_MY_CUSTOM_NAME"7  ),8})9
10export default MyCustom

The index method optionally accepts the name of the index as a parameter.

In this example, you define an index on the name property.


Define Database Index on Data Model#

A data model has an indexes method that defines database indices on its properties.

The index can be on multiple columns (composite index). For example:

Code
1import { model } from "@medusajs/framework/utils"2
3const MyCustom = model.define("my_custom", {4  id: model.id().primaryKey(),5  name: model.text(),6  age: model.number(),7}).indexes([8  {9    on: ["name", "age"],10  },11])12
13export default MyCustom

The indexes method receives an array of indices as a parameter. Each index is an object with a required on property indicating the properties to apply the index on.

In the above example, you define a composite index on the name and age properties.

Index Conditions#

An index can have conditions. For example:

Code
1import { model } from "@medusajs/framework/utils"2
3const MyCustom = model.define("my_custom", {4  id: model.id().primaryKey(),5  name: model.text(),6  age: model.number(),7}).indexes([8  {9    on: ["name", "age"],10    where: {11      age: 30,12    },13  },14])15
16export default MyCustom

The index object passed to indexes accepts a where property whose value is an object of conditions. The object's key is a property's name, and its value is the condition on that property.

In the example above, the composite index is created on the name and age properties when the age's value is 30.

A property's condition can be a negation. For example:

Code
1import { model } from "@medusajs/framework/utils"2
3const MyCustom = model.define("my_custom", {4  id: model.id().primaryKey(),5  name: model.text(),6  age: model.number().nullable(),7}).indexes([8  {9    on: ["name", "age"],10    where: {11      age: {12        $ne: null,13      },14    },15  },16])17
18export default MyCustom

A property's value in where can be an object having a $ne property. $ne's value indicates what the specified property's value shouldn't be.

In the example above, the composite index is created on the name and age properties when age's value is not null.

Unique Database Index#

The object passed to indexes accepts a unique property indicating that the created index must be a unique index.

For example:

Code
1import { model } from "@medusajs/framework/utils"2
3const MyCustom = model.define("my_custom", {4  id: model.id().primaryKey(),5  name: model.text(),6  age: model.number(),7}).indexes([8  {9    on: ["name", "age"],10    unique: true,11  },12])13
14export default MyCustom

This creates a unique composite index on the name and age properties.

Was this chapter helpful?
Edit this page