* docs improvements and changes * updated module definition * modules + dml changes * fix build * fix vale error * fix lint errors * fixes to stripe docs * fix condition * fix condition * fix module defintion * fix checkout * disable UI action * change oas preview action * flatten provider module options * fix lint errors * add module link docs * pr comments fixes * fix vale error * change node engine version * links -> linkable * add note about database name * small fixes * link fixes * fix response code in api reference * added migrations step
160 lines
3.9 KiB
Plaintext
160 lines
3.9 KiB
Plaintext
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. |