Spec-Zone.ru › Mongoose

Модели

Модели — это расширенные конструкторы, скомпилированные из Schema определений. Экземпляр модели называется документом. Модели отвечают за создание и чтение документов из базы данных MongoDB.

  • Компиляция первой модели
  • Создание документов
  • Запросы
  • Удаление
  • Обновление
  • Потоки изменений
  • Просмотры

Компиляция первой модели

При вызове mongoose.model() для схемы Mongoose компилирует для вас модель.

const schema = new mongoose.Schema({ name: String, size: String });
const Tank = mongoose.model('Tank', schema);

Первый аргумент — единственное имя коллекции, для которой предназначена модель. Mongoose автоматически ищет множественное число, в нижнем регистре имени вашей модели. Таким образом, для примера выше, модель Tank предназначена для коллекции tanks в базе данных.

Примечание: Функция .model() создает копию schema. Убедитесь, что вы добавили все необходимое в schema, включая хуки, перед вызовом .model()!

Создание документов

Экземпляр модели называется документом. Их создание и сохранение в базе данных очень просто.

const Tank = mongoose.model('Tank', yourSchema);

const small = new Tank({ size: 'small' });
await small.save();

// or

await Tank.create({ size: 'small' });

// or, for inserting large batches of documents
await Tank.insertMany([{ size: 'small' }]);

Обратите внимание, что никакие танки не будут созданы/удалены до тех пор, пока соединение, используемое вашей моделью, не будет открыто. Каждая модель имеет связанное соединение. Когда вы используете mongoose.model(), ваша модель будет использовать стандартное соединение mongoose.

await mongoose.connect('mongodb://127.0.0.1/gettingstarted');

Если вы создали пользовательское соединение, используйте функцию model() этого соединения вместо.

const connection = mongoose.createConnection('mongodb://127.0.0.1:27017/test');
const Tank = connection.model('Tank', yourSchema);

Запросы

Поиск документов с Mongoose прост, он поддерживает богатый синтаксис запросов MongoDB. Документы могут быть извлечены с помощью статических функций find, findById, findOne или where модели.

await Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec();

Дополнительные сведения о том, как использовать API Query, см. в главе о запросах.

Удаление

Модели имеют статические функции deleteOne() и deleteMany() для удаления всех документов, соответствующих заданному filter.

await Tank.deleteOne({ size: 'large' });

Обновление

У каждой model есть свой метод update для изменения документов в базе данных без возврата их в ваше приложение. Дополнительные сведения см. в документации API.

// Updated at most one doc, `res.nModified` contains the number
// of docs that MongoDB updated
await Tank.updateOne({ size: 'large' }, { name: 'T-90' });

Если вы хотите обновить один документ в базе данных и вернуть его в ваше приложение, используйте findOneAndUpdate вместо этого.

Потоки изменений

Потоки изменений предоставляют способ прослушивания всех вставок и обновлений, проходящих через вашу базу данных MongoDB. Обратите внимание, что потоки изменений не работают, если вы не подключены к реплицированной базе данных MongoDB.

async function run() {
  // Create a new mongoose model
  const personSchema = new mongoose.Schema({
    name: String
  });
  const Person = mongoose.model('Person', personSchema);

  // Create a change stream. The 'change' event gets emitted when there's a
  // change in the database
  Person.watch().
    on('change', data => console.log(new Date(), data));

  // Insert a doc, will trigger the change stream handler above
  console.log(new Date(), 'Inserting doc');
  await Person.create({ name: 'Axl Rose' });
}

Вывод из приведенной выше асинхронной функции будет выглядеть так, как показано ниже.

2018-05-11T15:05:35.467Z 'Inserting doc'
2018-05-11T15:05:35.487Z 'Inserted doc'
2018-05-11T15:05:35.491Z { _id: { _data: ... },
  operationType: 'insert',
  fullDocument: { _id: 5af5b13fe526027666c6bf83, name: 'Axl Rose', __v: 0 },
  ns: { db: 'test', coll: 'Person' },
  documentKey: { _id: 5af5b13fe526027666c6bf83 } }

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

Просмотры

Просмотры MongoDB — это по сути, только для чтения коллекции, содержащие данные, вычисленные из других коллекций с использованием агрегаций. В Mongoose для каждого из ваших Просмотров следует определить отдельную модель. Вы также можете создать Просмотр с помощью createCollection().

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

// Make sure to disable `autoCreate` and `autoIndex` for Views,
// because you want to create the collection manually.
const userSchema = new Schema({
  name: String,
  email: String,
  roles: [String]
}, { autoCreate: false, autoIndex: false });
const User = mongoose.model('User', userSchema);

const RedactedUser = mongoose.model('RedactedUser', userSchema);

// First, create the User model's underlying collection...
await User.createCollection();
// Then create the `RedactedUser` model's underlying collection
// as a View.
await RedactedUser.createCollection({
  viewOn: 'users', // Set `viewOn` to the collection name, **not** model name.
  pipeline: [
    {
      $set: {
        name: { $concat: [{ $substr: ['$name', 0, 3] }, '...'] },
        email: { $concat: [{ $substr: ['$email', 0, 3] }, '...'] }
      }
    }
  ]
});

await User.create([
  { name: 'John Smith', email: 'john.smith@gmail.com', roles: ['user'] },
  { name: 'Bill James', email: 'bill@acme.co', roles: ['user', 'admin'] }
]);

// [{ _id: ..., name: 'Bil...', email: 'bil...', roles: ['user', 'admin'] }]
console.log(await RedactedUser.find({ roles: 'admin' }));

Обратите внимание, что Mongoose не в настоящее время требует, чтобы Просмотры были только для чтения. Если вы попытаетесь save() документ из Просмотра, вы получите ошибку от сервера MongoDB.

Ещё

В документации API описаны многие дополнительные методы, такие как count, mapReduce, aggregate и другие.

Далее

Теперь, когда мы рассмотрели Models, давайте посмотрим на Документы.

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

Spec-Zone.ru

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