Spec-Zone.ru › Mongoose

Схема

Схема()

Параметры:
  • [definition] «Объект|Схема|Массив» Может быть одним из: объект, описывающий пути схемы, или схема для копирования, или массив объектов и схем
  • [options] «Объект»
Наследует:
  • «NodeJS EventEmitter»

Конструктор схемы.

Пример:

const child = new Schema({ name: String });
const schema = new Schema({ name: String, age: Number, children: [child] });
const Tree = mongoose.model('Tree', schema);

// setting schema options
new Schema({ name: String }, { _id: false, autoIndex: false })

Параметры:

  • autoIndex: bool - по умолчанию null (что означает использование параметра autoIndex соединения)
  • autoCreate: bool - по умолчанию null (что означает использование параметра autoCreate соединения)
  • bufferCommands: bool - по умолчанию true
  • bufferTimeoutMS: число - по умолчанию 10000 (10 секунд). Если bufferCommands включено, это время, которое Mongoose будет ждать восстановления подключения перед ошибкой.
  • capped: bool | число | объект - по умолчанию false
  • collection: строка - без значения по умолчанию
  • discriminatorKey: строка - по умолчанию __t
  • id: bool - по умолчанию true
  • _id: bool - по умолчанию true
  • minimize: bool - управляет поведением document#toObject при его ручном вызове - по умолчанию true
  • read: строка
  • writeConcern: объект - по умолчанию null, используется для переопределения параметров write concern MongoDB сервера
  • shardKey: объект - по умолчанию null
  • strict: bool - по умолчанию true
  • strictQuery: bool - по умолчанию false
  • toJSON - объект - без значения по умолчанию
  • toObject - объект - без значения по умолчанию
  • typeKey - строка - по умолчанию 'type'
  • validateBeforeSave - bool - по умолчанию true
  • validateModifiedOnly - bool - по умолчанию false
  • versionKey: строка или объект - по умолчанию "__v"
  • optimisticConcurrency: bool - по умолчанию false. Установите в true, чтобы включить оптимистическую конкурентность.
  • collation: объект - по умолчанию null (что означает отсутствие сортировки)
  • timeseries: объект - по умолчанию null (что означает, что коллекция этой схемы не будет коллекцией временных рядов)
  • selectPopulatedPaths: boolean - по умолчанию true
  • skipVersioning: объект - пути, которые нужно исключить из версиирования
  • timestamps: объект или boolean - по умолчанию false. Если true, Mongoose добавляет createdAt и updatedAt свойства к вашей схеме и управляет этими свойствами за вас.
  • pluginTags: массив строк - по умолчанию undefined. Если задано и плагин вызван с параметром tags, плагин будет применен только к схемам с совпадающим тегом.
  • virtuals: объект - виртуальные свойства для определения, алиас для .virtual
  • [collectionOptions]: объект с параметрами, передаваемыми в createCollection() при вызове Model.createCollection() или autoCreate установлены в true.

Параметры для вложенных схем:

  • excludeIndexes: bool - по умолчанию false. Если true, пропуск построения индексов по путям этой схемы.

Примечание:

При вложении схем (children в примере выше), всегда сначала объявляйте дочернюю схему, прежде чем передавать её в родительскую.

Схема.Типы

Тип:
  • «свойство»

Различные встроенные типы схем Mongoose.

Пример:

const mongoose = require('mongoose');
const ObjectId = mongoose.Schema.Types.ObjectId;

Типы:

  • Строка
  • Число
  • Булево | Bool
  • Массив
  • Буфер
  • Дата
  • ObjectId | Oid
  • Смешанный
  • UUID
  • BigInt

Используя этот доступ к типу схемы Mixed, мы можем использовать их в нашей схеме.

const Mixed = mongoose.Schema.Types.Mixed;
new mongoose.Schema({ _user: Mixed })

Схема.типыИндексов

Тип:
  • «свойство»

Разрешенные типы индексов

Схема.прототип.добавить()

Параметры:
  • obj «Объект|Схема» простой объект с путями для добавления или другая схема
  • [prefix] «Строка» путь для префикса новых добавленных путей
Возвращает:
  • «Схема» экземпляр схемы

Добавляет пары ключевых путей/типов схемы к этой схеме.

Пример:

const ToySchema = new Schema();
ToySchema.add({ name: 'string', color: 'string', price: 'number' });

const TurboManSchema = new Schema();
// You can also `add()` another schema and copy over all paths, virtuals,
// getters, setters, indexes, methods, and statics.
TurboManSchema.add(ToySchema).add({ year: Number });

Схема.прототип.псевдоним()

Параметры:
  • path «Строка» реальный путь для псевдонима
  • alias «Строка|Массив[Строка]» путь(и) для использования в качестве псевдонима для path
Возвращает:
  • «Схема» экземпляр схемы

Добавить псевдоним для path. Это означает, что получение или установка alias эквивалентно получению или установке path.

Пример:

const toySchema = new Schema({ n: String });

// Make 'name' an alias for 'n'
toySchema.alias('n', 'name');

const Toy = mongoose.model('Toy', toySchema);
const turboMan = new Toy({ n: 'Turbo Man' });

turboMan.name; // 'Turbo Man'
turboMan.n; // 'Turbo Man'

turboMan.name = 'Turbo Man Action Figure';
turboMan.n; // 'Turbo Man Action Figure'

await turboMan.save(); // Saves { _id: ..., n: 'Turbo Man Action Figure' }

Схема.прототип.вложенныеСхемы

Тип:
  • «свойство»

Массив дочерних схем (из массивов документов и отдельных вложенных поддокументов) и соответствующих скомпилированных моделей. Каждый элемент массива — объект с 2 свойствами: schema и model.

Это свойство обычно полезно только авторам плагинов и продвинутым пользователям. Вам не нужно взаимодействовать с этим свойством, чтобы использовать mongoose.

Схема.прототип.очиститьИндексы()

Возвращает:
  • «Схема» экземпляр схемы

Удаляет все индексы из этой схемы.

clearIndexes удаляет индексы только из вашего объекта схемы. Не влияет на индексы в MongoDB.

Пример:

const ToySchema = new Schema({ name: String, color: String, price: Number });
ToySchema.index({ name: 1 });
ToySchema.index({ color: 1 });

// Remove all indexes on this schema
ToySchema.clearIndexes();

ToySchema.indexes(); // []

Схема.прототип.клонировать()

Возвращает:
  • «Схема» клонированная схема

Возвращает глубокую копию схемы

Пример:

const schema = new Schema({ name: String });
const clone = schema.clone();
clone === schema; // false
clone.path('name'); // SchemaString { ... }

Схема.прототип.дискриминатор()

Параметры:
  • name «Строка» имя дискриминатора
  • schema «Схема» дискриминируемая схема
Возвращает:
  • «Схема» экземпляр схемы

Наследовать схему, применяя дискриминатор к существующей схеме.

Пример:

const eventSchema = new mongoose.Schema({ timestamp: Date }, { discriminatorKey: 'kind' });

const clickedEventSchema = new mongoose.Schema({ element: String }, { discriminatorKey: 'kind' });
const ClickedModel = eventSchema.discriminator('clicked', clickedEventSchema);

const Event = mongoose.model('Event', eventSchema);

Event.discriminators['clicked']; // Model { clicked }

const doc = await Event.create({ kind: 'clicked', element: '#hero' });
doc.element; // '#hero'
doc instanceof ClickedModel; // true

Схема.прототип.каждыйПуть()

Параметры:
  • fn «Функция» функция обратного вызова
Возвращает:
  • «Схема» это

Итерирует пути схем, аналогично Array#forEach.

Обратный вызов получает имя пути и экземпляр schemaType.

Пример:

const userSchema = new Schema({ name: String, registeredAt: Date });
userSchema.eachPath((pathname, schematype) => {
  // Prints twice:
  // name SchemaString { ... }
  // registeredAt SchemaDate { ... }
  console.log(pathname, schematype);
});

Схема.прототип.получить()

Параметры:
  • key «Строка» Имя параметра для получения текущего значения
Возвращает:
  • «Любое» значение параметра

Получает параметр схемы.

Пример:

schema.get('strict'); // true
schema.set('strict', false);
schema.get('strict'); // false

Схема.прототип.индекс()

Параметры:
  • fields «Объект» Поля для индексирования, в порядке, доступные значения: 1 | -1 | '2d' | '2dsphere' | 'geoHaystack' | 'hashed' | 'text'
  • [options] «Объект» Параметры для передачи в функцию MongoDB драйвера createIndex()
    • [options.expires=null] «Строка|число» Mongoose-специфичный синтаксический сахар, использует ms для преобразования параметра expires в секунды для expireAfterSeconds в ссылке выше.
    • [options.language_override=null] «Строка» Указывает mongodb использовать указанное поле вместо language для разбора текстовых индексов.

Определяет индекс (вероятно, составной) для этой схемы.

Пример:

schema.index({ first: 1, last: -1 })

Schema.prototype.indexes()

Возвращает:
  • «Массив» список индексов, определённых в схеме

Возвращает список индексов, объявленных этой схемой, через schema.index() или по index: true в параметрах пути. Индексы выражаются как массив [spec, options].

Пример:

const userSchema = new Schema({
  email: { type: String, required: true, unique: true },
  registeredAt: { type: Date, index: true }
});

// [ [ { email: 1 }, { unique: true, background: true } ],
//   [ { registeredAt: 1 }, { background: true } ] ]
userSchema.indexes();

Плагины могут использовать возвращаемое значение этой функции для изменения индексов схемы. Например, указанный ниже плагин по умолчанию делает каждый индекс уникальным.

function myPlugin(schema) {
  for (const index of schema.indexes()) {
    if (index[1].unique === undefined) {
      index[1].unique = true;
    }
  }
}

Schema.prototype.loadClass()

Параметры:
  • model «Функция» Класс для загрузки
  • [virtualsOnly] «Логическое значение» если имеет истинное значение, извлекает только виртуальные значения из класса, а не методы или статические свойства

Загружает ES6 класс в схему. Отображает сеттеры + геттеры, статические методы и методы экземпляра в схему виртуальные, статические и методы.

Пример:

const md5 = require('md5');
const userSchema = new Schema({ email: String });
class UserClass {
  // `gravatarImage` becomes a virtual
  get gravatarImage() {
    const hash = md5(this.email.toLowerCase());
    return `https://www.gravatar.com/avatar/${hash}`;
  }

  // `getProfileUrl()` becomes a document method
  getProfileUrl() {
    return `https://mysite.com/${this.email}`;
  }

  // `findByEmail()` becomes a static
  static findByEmail(email) {
    return this.findOne({ email });
  }
}

// `schema` will now have a `gravatarImage` virtual, a `getProfileUrl()` method,
// and a `findByEmail()` static
userSchema.loadClass(UserClass);

Schema.prototype.method()

Параметры:
  • name «Строка|Объект» Имя метода для одной функции или объект пар «имя-функция».
  • [fn] «Функция» Функция в определении одной функции.

Добавляет метод экземпляра документам, созданным из моделей, скомпилированных из этой схемы.

Пример:

const schema = kittySchema = new Schema(..);

schema.method('meow', function () {
  console.log('meeeeeoooooooooooow');
})

const Kitty = mongoose.model('Kitty', schema);

const fizz = new Kitty;
fizz.meow(); // meeeeeooooooooooooow

Если передаётся хеш пар имя/функция как единственный аргумент, каждая пара имя/функция добавляется как метод.

schema.method({
    purr: function () {}
  , scratch: function () {}
});

// later
const fizz = new Kitty;
fizz.purr();
fizz.scratch();

ПРИМЕЧАНИЕ: Schema.method() добавляет методы экземпляра в объект Schema.methods. Вы также можете добавить методы экземпляра непосредственно в объект Schema.methods, как показано в руководстве

Schema.prototype.obj

Тип:
  • «свойство»

Исходный объект, переданный конструктору схемы

Пример:

const schema = new Schema({ a: String }).add({ b: String });
schema.obj; // { a: String }

Schema.prototype.omit()

Параметры:
  • paths «Массив[Строка]» Список путей для исключения из новой схемы
  • [options] «Объект» Параметры для передачи конструктору новой схемы (аналогично new Schema(.., Options)). По умолчанию this.options если не задано.
Возвращает:
  • «Схема»

Возвращает новую схему, содержащую paths из исходной схемы, за вычетом исключённых.

Этот метод аналогичен функции Lodash's omit() для схем Mongoose.

Пример:

const schema = Schema({ name: String, age: Number });
// Creates a new schema omitting the `age` path
const newSchema = schema.omit(['age']);

newSchema.path('name'); // SchemaString { ... }
newSchema.path('age'); // undefined

Schema.prototype.path()

Параметры:
  • path «Строка» Имя пути для получения/установки
  • [obj] «Объект» Тип для установки пути, если предоставлен, путь будет УСТАНОВЛЕН, иначе путь будет получен

Получение/установка путей схемы.

Устанавливает путь (если арность 2) Получает путь (если арность 1)

Пример:

schema.path('name') // returns a SchemaType
schema.path('name', Number) // changes the schemaType of `name` to Number

Schema.prototype.pathType()

Параметры:
  • path «Строка»
Возвращает:
  • «Строка»

Возвращает тип пути path для этой схемы.

Принимая путь, возвращает, является ли он реальным, виртуальным, вложенным или случайным/неопределённым путём.

Пример:

const s = new Schema({ name: String, nested: { foo: String } });
s.virtual('foo').get(() => 42);
s.pathType('name'); // "real"
s.pathType('nested'); // "nested"
s.pathType('foo'); // "virtual"
s.pathType('fail'); // "adhocOrUndefined"

Schema.prototype.paths

Тип:
  • «свойство»

Пути, определённые в этой схеме. Ключи — это пути верхнего уровня в этой схеме, а значения — экземпляры класса SchemaType.

Пример:

const schema = new Schema({ name: String }, { _id: false });
schema.paths; // { name: SchemaString { ... } }

schema.add({ age: Number });
schema.paths; // { name: SchemaString { ... }, age: SchemaNumber { ... } }

Schema.prototype.pick()

Параметры:
  • paths «Массив[Строка]» Список путей для выбора для новой схемы
  • [options] «Объект» Параметры для передачи конструктору новой схемы (аналогично new Schema(.., Options)). По умолчанию this.options если не задано.
Возвращает:
  • «Схема»

Возвращает новую схему, содержащую выбранные paths из этой схемы.

Этот метод аналогичен функции Lodash's pick() для схем Mongoose.

Пример:

const schema = Schema({ name: String, age: Number });
// Creates a new schema with the same `name` path as `schema`,
// but no `age` path.
const newSchema = schema.pick(['name']);

newSchema.path('name'); // SchemaString { ... }
newSchema.path('age'); // undefined

Schema.prototype.plugin()

Параметры:
  • plugin «Функция» Обратный вызов плагина
  • [opts] «Объект» Параметры для передачи плагину
    • [opts.deduplicate=false] «Логическое значение» Если true, игнорировать повторяющиеся плагины (тот же аргумент fn с использованием ===).
См.:
  • плагины

Регистрирует плагин для этой схемы.

Пример:

const s = new Schema({ name: String });
s.plugin(schema => console.log(schema.path('name').path));
mongoose.model('Test', s); // Prints 'name'

Или с параметрами:

const s = new Schema({ name: String });
s.plugin((schema, opts) => console.log(opts.text, schema.path('name').path), { text: "Schema Path Name:" });
mongoose.model('Test', s); // Prints 'Schema Path Name: name'

Schema.prototype.post()

Параметры:
  • methodName «Строка|Регулярное выражение|Массив[Строка]» Имя метода или регулярное выражение для сопоставления имени метода
  • [options] «Объект»
    • [options.document] «Логическое значение» Если name является хуком для промежуточных звеньев документов и запросов, установите значение true для запуска на промежуточном звене документов.
    • [options.query] «Логическое значение» Если name является хуком для промежуточных звеньев документов и запросов, установите значение true для запуска на промежуточном звене запросов.
  • fn «Функция» обратный вызов
См.:
  • промежуточные звенья
  • kareem

Определяет пост-хук для документа

const schema = new Schema(..);
schema.post('save', function (doc) {
  console.log('this fired after a document was saved');
});

schema.post('find', function(docs) {
  console.log('this fired after you ran a find query');
});

schema.post(/Many$/, function(res) {
  console.log('this fired after you ran `updateMany()` or `deleteMany()`');
});

const Model = mongoose.model('Model', schema);

const m = new Model(..);
m.save(function(err) {
  console.log('this fires after the `post` hook');
});

m.find(function(err, docs) {
  console.log('this fires after the post find hook');
});

Schema.prototype.pre()

Параметры:
  • methodName «Строка|Регулярное выражение|Массив[Строка]» Имя метода или регулярное выражение для сопоставления имени метода
  • [options] «Объект»
    • [options.document] «Логическое значение» Если name является хуком для промежуточных звеньев документов и запросов, установите значение true для запуска на промежуточном звене документов. Например, установите options.document в true для применения этого хука к Document#deleteOne() вместо Query#deleteOne().
    • [options.query] «Логическое значение» Если name является хуком для промежуточных звеньев документов и запросов, установите значение true для запуска на промежуточном звене запросов.
  • callback «Функция»

Определяет пре-хук для модели.

Пример:

const toySchema = new Schema({ name: String, created: Date });

toySchema.pre('save', function(next) {
  if (!this.created) this.created = new Date;
  next();
});

toySchema.pre('validate', function(next) {
  if (this.name !== 'Woody') this.name = 'Woody';
  next();
});

// Equivalent to calling `pre()` on `find`, `findOne`, `findOneAndUpdate`.
toySchema.pre(/^find/, function(next) {
  console.log(this.getFilter());
});

// Equivalent to calling `pre()` on `updateOne`, `findOneAndUpdate`.
toySchema.pre(['updateOne', 'findOneAndUpdate'], function(next) {
  console.log(this.getFilter());
});

toySchema.pre('deleteOne', function() {
  // Runs when you call `Toy.deleteOne()`
});

toySchema.pre('deleteOne', { document: true }, function() {
  // Runs when you call `doc.deleteOne()`
});

Schema.prototype.queue()

Параметры:
  • name «Строка» имя метода документа, который нужно вызвать позже
  • args «Массив» аргументы для передачи методу

Добавляет вызов метода в очередь.

Пример:

schema.methods.print = function() { console.log(this); };
schema.queue('print', []); // Print the doc every one is instantiated

const Model = mongoose.model('Test', schema);
new Model({ name: 'test' }); // Prints '{"_id": ..., "name": "test" }'

Schema.prototype.remove()

Параметры:
  • path «Строка|Массив» Путь(и) для удаления
Возвращает:
  • «Схема» экземпляр схемы

Удаляет указанный path (или [paths]).

Пример:

const schema = new Schema({ name: String, age: Number });
schema.remove('name');
schema.path('name'); // Undefined
schema.path('age'); // SchemaNumber { ... }

Или как массив:

schema.remove(['name', 'age']);
schema.path('name'); // Undefined
schema.path('age'); // Undefined

Schema.prototype.removeIndex()

Параметры:
  • index «Объект|строка» имя или спецификация индекса
Возвращает:
  • «Схема» экземпляр схемы

Удаляет индекс по имени или спецификации индекса.

removeIndex удаляет индексы только из вашего объекта схемы. Не влияет на индексы в MongoDB.

Пример:

const ToySchema = new Schema({ name: String, color: String, price: Number });

// Add a new index on { name, color }
ToySchema.index({ name: 1, color: 1 });

// Remove index on { name, color }
// Keep in mind that order matters! `removeIndex({ color: 1, name: 1 })` won't remove the index
ToySchema.removeIndex({ name: 1, color: 1 });

// Add an index with a custom name
ToySchema.index({ color: 1 }, { name: 'my custom index name' });
// Remove index by name
ToySchema.removeIndex('my custom index name');

Schema.prototype.removeVirtual()

Параметры:
  • path «String|Array» Пути виртуальных свойств (или нескольких путей), которые нужно удалить.

Удаляет указанные виртуальные свойства из схемы.

Schema.prototype.requiredPaths()

Параметры:
  • invalidate «Boolean» Обновить кэш
Возвращает:
  • «Array»

Возвращает массив строк путей, которые требуются этой схемой.

Пример:

const s = new Schema({
  name: { type: String, required: true },
  age: { type: String, required: true },
  notes: String
});
s.requiredPaths(); // [ 'age', 'name' ]

Schema.prototype.set()

Параметры:
  • key «String» Имя опции, значение которой нужно установить
  • [value] «Object» Значение, на которое нужно установить опцию. Если не указано, опция будет сброшена до значения по умолчанию
  • [tags] «Array<string>» теги для добавления в предпочтение чтения, если ключ === 'read'
См. также:
  • Схема

Устанавливает опцию схемы.

Пример:

schema.set('strict'); // 'true' by default
schema.set('strict', false); // Sets 'strict' to false
schema.set('strict'); // 'false'

Schema.prototype.static()

Параметры:
  • name «String|Object» Имя метода для отдельной функции или объект пар «имя-функция».
  • [fn] «Function» Функция в определении отдельной функции.
См. также:
  • Статики

Добавляет статические методы «класса» к моделям, скомпилированным из этой схемы.

Пример:

const schema = new Schema(..);
// Equivalent to `schema.statics.findByName = function(name) {}`;
schema.static('findByName', function(name) {
  return this.find({ name: name });
});

const Drink = mongoose.model('Drink', schema);
await Drink.findByName('LaCroix');

Если в качестве единственного аргумента передаётся хеш пар «имя-функция», каждая пара будет добавлена в качестве методов.

schema.static({
    findByName: function () {..}
  , findByCost: function () {..}
});

const Drink = mongoose.model('Drink', schema);
await Drink.findByName('LaCroix');
await Drink.findByCost(3);

Если в качестве единственного аргумента передаётся хеш пар «имя-функция», каждая пара будет добавлена в качестве статических методов.

Schema.prototype.virtual()

Параметры:
  • name «String» Имя виртуального свойства
  • [options] «Object»
    • [options.ref] «String|Model» имя модели или экземпляр модели. Помечает это как виртуальное свойство для популяции.
    • [options.localField] «String|Function» Требуется для виртуальных свойств для популяции. См. документацию по виртуальным свойствам для популяции для получения дополнительной информации.
    • [options.foreignField] «String|Function» Требуется для виртуальных свойств для популяции. См. документацию по виртуальным свойствам для популяции для получения дополнительной информации.
    • [options.justOne=false] «Boolean|Function» Работает только с виртуальными свойствами для популяции. Если значение истинно, будет один документ или null. В противном случае виртуальное свойство для популяции будет массивом.
    • [options.count=false] «Boolean» Работает только с виртуальными свойствами для популяции. Если значение истинно, это виртуальное свойство для популяции будет содержать количество документов, а не сами документы, когда вы populate().
    • [options.get=null] «Function|null» Добавляет геттер к этому виртуальному свойству для преобразования загруженного документа.
    • [options.match=null] «Object|Function» Применяет опцию по умолчанию match для популяции, добавляя дополнительный фильтр к запросу популяции.
Возвращает:
  • «VirtualType»

Создаёт виртуальное свойство с заданным именем.

Schema.prototype.virtualpath()

Параметры:
  • name «String» Имя виртуального свойства, которое нужно получить
Возвращает:
  • «VirtualType,null»

Возвращает виртуальное свойство с данным name.

Schema.prototype.virtuals

Тип:
  • «свойство»

Объект, содержащий все виртуальные свойства, определённые в этой схеме. Ключи объекта — пути виртуальных свойств, а значения — экземпляры VirtualType.

Это свойство, как правило, полезно только для авторов плагинов и продвинутых пользователей. Вам не нужно взаимодействовать с этим свойством, чтобы использовать mongoose.

Пример:

const schema = new Schema({});
schema.virtual('answer').get(() => 42);

console.log(schema.virtuals); // { answer: VirtualType { path: 'answer', ... } }
console.log(schema.virtuals['answer'].getters[0].call()); // 42

Schema.reserved

Тип:
  • «свойство»

Зарезервированные ключи документов.

Ключи в этом объекте — это имена, которые вызывают предупреждение при объявлении схемы, поскольку они могут нарушить функциональность Mongoose/плагинов Mongoose. Если вы создаёте схему с использованием new Schema() с одним из этих имён свойств, Mongoose выведет предупреждение.

  • _posts
  • _pres
  • collection
  • emit
  • errors
  • get
  • init
  • isModified
  • isNew
  • listeners
  • modelName
  • on
  • once
  • populated
  • prototype
  • remove
  • removeListener
  • save
  • schema
  • toObject
  • validate

ПРИМЕЧАНИЕ: Использование этих терминов в качестве имён методов разрешено, но используйте на свой страх и риск, так как они могут быть существующими методами документов mongoose, которые вы перезаписываете.

 const schema = new Schema(..);
 schema.methods.init = function () {} // potentially breaking

© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/api/schema.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API