9.0 KiB
Collection
Overview
Collection is used to define the data model in the system, such as model name, fields, indexes, associations, and other information. It is usually called through the collection method of the Database instance as a proxy entry.
const { Database } = require('@nocobase/database')
// Create database instance
const db = new Database({...});
// Define data model
db.collection({
name: 'users',
// Define model fields
fields: [
// Scalar field
{
name: 'name',
type: 'string',
},
// Association field
{
name: 'profile',
type: 'hasOne' // 'hasMany', 'belongsTo', 'belongsToMany'
}
],
});
Refer to Fields for more field types.
Constructor
Signature
constructor(options: CollectionOptions, context: CollectionContext)
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
options.name |
string |
- | Identifier of the collection |
options.tableName? |
string |
- | Database table name, the value of options.name is used if not set |
options.fields? |
FieldOptions[] |
- | Definition of fields, refer to Field for details |
options.model? |
string | ModelStatic<Model> |
- | Model type of Sequelize; in case string is used, this model name needs to be registered in the db before being called |
options.repository? |
string | RepositoryType |
- | Data repository type; in case string is used, this repository type needs to be registered in the db before being called |
options.sortable? |
string | boolean | { name?: string; scopeKey?: string } |
- | Configure which fields are sortable; not sortable by default |
options.autoGenId? |
boolean |
true |
Whether to automatically generate unique primary key; true by default |
context.database |
Database |
- | The context database in which it resides |
Example
Create a table posts:
const posts = new Collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
},
{
type: 'double',
name: 'price',
}
]
}, {
// An existing database instance
database: db
});
Instance Members
options
Initial parameters for data table configuration, which are consistent with the options parameter of the constructor.
context
The contextual environment to which the current data table belongs, currently mainly the database instance.
name
Name of the data table.
db
The database instance to which it belongs.
filterTargetKey
Name of the field that is used as the primary key.
isThrough
Whether it is an intermediate table.
model
Match the Model type of Sequelize.
repository
Data repository instance.
Field Configuration Methods
getField()
Get a field object whose corresponding name has been defined in the data table.
Signature
getField(name: string): Field
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
name |
string |
- | Name of the field |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
const field = posts.getField('title');
setField()
Set a field to the data table.
Signature
setField(name: string, options: FieldOptions): Field
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
name |
string |
- | Name of the field |
options |
FieldOptions |
- | Configuration of the field, refer to Field for details |
Example
const posts = db.collection({ name: 'posts' });
posts.setField('title', { type: 'string' });
setFields()
Set multiple fields to the data table.
Signature
setFields(fields: FieldOptions[], resetFields = true): Field[]
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
fields |
FieldOptions[] |
- | Configuration of the fields, refer to Field for details |
resetFields |
boolean |
true |
Whether to reset existing fields |
Example
const posts = db.collection({ name: 'posts' });
posts.setFields([
{ type: 'string', name: 'title' },
{ type: 'double', name: 'price' }
]);
removeField()
Remove a field object whose corresponding name has been defined in the data table.
Signature
removeField(name: string): void | Field
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
name |
string |
- | Name of the field |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.removeField('title');
resetFields()
Reset (Empty) fields of the data table.
Signature
resetFields(): void
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.resetFields();
hasField()
Check if the data table has defined a field object with the corresponding name.
Signature
hasField(name: string): boolean
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
name |
string |
- | Name of the field |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.hasField('title'); // true
findField()
Find field objects in the data table that match the conditions.
Signature
findField(predicate: (field: Field) => boolean): Field | undefined
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
predicate |
(field: Field) => boolean |
- | The condition |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.findField(field => field.name === 'title');
forEachField()
Iterate over field objects in the data table.
Signature
forEachField(callback: (field: Field) => void): void
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
callback |
(field: Field) => void |
- | Callback function |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.forEachField(field => console.log(field.name));
Index Configuration Methods
addIndex()
Add data table index.
Signature
addIndex(index: string | string[] | { fields: string[], unique?: boolean,[key: string]: any })
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
index |
string | string[] |
- | Names of fields to be indexed |
index |
{ fields: string[], unique?: boolean, [key: string]: any } |
- | Full configuration |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.addIndex({
fields: ['title'],
unique: true
});
removeIndex()
Remove data table index.
Signature
removeIndex(fields: string[])
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
fields |
string[] |
- | Names of fields to remove indexes |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
],
indexes: [
{
fields: ['title'],
unique: true
}
]
});
posts.removeIndex(['title']);
Table Configuration Methods
remove()
Remove data table.
Signature
remove(): void
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
posts.remove();
Database Operation Methods
sync()
Synchronize the definitions in data table to the database. In addition to the default Model.sync logic in Sequelize, the data tables corresponding to the relational fields will also be handled together.
Signature
sync(): Promise<void>
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
await posts.sync();
existsInDb()
Check whether the data table exists in the database.
Signature
existsInDb(options?: Transactionable): Promise<boolean>
Parameter
| Name | Type | Default | Description |
|---|---|---|---|
options?.transaction |
Transaction |
- | Transaction instance |
Example
const posts = db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
const existed = await posts.existsInDb();
console.log(existed); // false
removeFromDb()
Signature
removeFromDb(): Promise<void>
Example
const books = db.collection({
name: 'books'
});
// Synchronize the table books to the database
await db.sync();
// Remove the table books from the database
await books.removeFromDb();