4.3.7. Data Model Index

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

Define Index on Property#

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

For example:

1import { model } from "@medusajs/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 Index on Data Model#

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

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

1import { model } from "@medusajs/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:

1import { model } from "@medusajs/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 that 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:

1import { model } from "@medusajs/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 Data Model Index#

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

For example:

1import { model } from "@medusajs/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?