export const metadata = {
  title: `${pageNumber} Data Model Index`,
}

# {metadata.title}

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:

export const highlights = [
  ["5", "index", "Define an index on the `name` property."],
  ["6", '"IDX_MY_CUSTOM_NAME"', "Index name is optional."]
]

```ts highlights={highlights}
import { model } from "@medusajs/utils"

const MyCustom = model.define("my_custom", {
  id: model.id().primaryKey(),
  name: model.text().index(
    "IDX_MY_CUSTOM_NAME"
  ),
})

export 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:

export const dataModelIndexHighlights = [
  ["7", "indexes", "Define indices on the data model's properties."],
  ["9", "on", "Specify the properties to define the index on."]
]

```ts highlights={dataModelIndexHighlights}
import { model } from "@medusajs/utils"

const MyCustom = model.define("my_custom", {
  id: model.id().primaryKey(),
  name: model.text(),
  age: model.number(),
}).indexes([
  {
    on: ["name", "age"],
  },
])

export 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:

export const conditionHighlights = [
  ["10", "where", "Specify conditions on properties."],
  ["11", "", "Create the index when `age` is `30`."]
]

```ts highlights={conditionHighlights}
import { model } from "@medusajs/utils"

const MyCustom = model.define("my_custom", {
  id: model.id().primaryKey(),
  name: model.text(),
  age: model.number(),
}).indexes([
  {
    on: ["name", "age"],
    where: {
      age: 30,
    },
  },
])

export 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:

export const negationHighlights = [
  ["12", "", "Create the index when `age` is not `null`."]
]

```ts highlights={negationHighlights}
import { model } from "@medusajs/utils"

const MyCustom = model.define("my_custom", {
  id: model.id().primaryKey(),
  name: model.text(),
  age: model.number().nullable(),
}).indexes([
  {
    on: ["name", "age"],
    where: {
      age: {
        $ne: null,
      },
    },
  },
])

export 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:

export const uniqueHighlights = [
  ["10", "unique", "Specify if the index is a unique index."]
]

```ts highlights={uniqueHighlights}
import { model } from "@medusajs/utils"

const MyCustom = model.define("my_custom", {
  id: model.id().primaryKey(),
  name: model.text(),
  age: model.number(),
}).indexes([
  {
    on: ["name", "age"],
    unique: true,
  },
])

export default MyCustom
```

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