Mongoose -- Schemas Models Documents

系统管理员 2022-06-09 11:57 256阅读 0赞

Schemas

Mongoose中,所有的东西都由Schemas开始。schema相当于是MongoDB的collection,并且定义了文档的结构。

  1. var mongoose = require('mongoose');
  2. var Schema = mongoose.Schema;
  3. var blogSchema = new Schema({
  4. title: String,
  5. author: String,
  6. body: String,
  7. comments: [{ body: String, date: Date }],
  8. date: { type: Date, default: Date.now },
  9. hidden: Boolean,
  10. meta: {
  11. votes: Number,
  12. favs: Number
  13. }
  14. });

上面的例子中,属性名后面是属性的类型,Schema允许的类型包括:

  1. String
  2. Number
  3. Date
  4. Buffer
  5. Boolean
  6. Mixed
  7. ObjectId
  8. Array

schema不仅可以用来定义文档的结构和属性,而且还可以用来定义实例方法,静态方法,索引,生命周期钩子方法,这些将在下文详细说明。

接下来,我们需要使用Schema来生成一个Model。

  1. var Blog = mongoose.model('Blog', blogSchema);

实例方法
关键字:Schema.methods

实例方法可以使用Schema来定义。

  1. // define a schema
  2. var animalSchema = new Schema({ name: String, type: String });
  3. // assign a function to the "methods" object of our animalSchema
  4. animalSchema.methods.findSimilarTypes = function(cb) {
  5. return this.model('Animal').find({ type: this.type }, cb);
  6. };

如此,所有的Animal实例都将拥有findSimilarTypes方法。

  1. var Animal = mongoose.model('Animal', animalSchema);
  2. var dog = new Animal({ type: 'dog' });
  3. dog.findSimilarTypes(function(err, dogs) {
  4. console.log(dogs); // woof
  5. });

Model静态方法
关键字:Schema.statics

  1. animalSchema.statics.findByName = function(name, cb) {
  2. return this.find({ name: new RegExp(name, 'i') }, cb);
  3. };
  4. var Animal = mongoose.model('Animal', animalSchema);
  5. Animal.findByName('fido', function(err, animals) {
  6. console.log(animals);
  7. });

索引

不太懂…附上原文吧。
这里写图片描述

虚拟属性

虚拟属性允许我们创建一个在MongoDB中不存在的属性。

  1. personSchema.virtual('fullName').get(function () {
  2. return this.name.first + ' ' + this.name.last;
  3. });

这样,我们就可以访问实例的fullName属性了,但其实这个属性在数据库中并不存在。

同时,给fullName我们还可以设置set:

  1. personSchema.virtual('fullName').
  2. get(function() { return this.name.first + ' ' + this.name.last; }).
  3. set(function(v) {
  4. this.name.first = v.substr(0, v.indexOf(' '));
  5. this.name.last = v.substr(v.indexOf(' ') + 1);
  6. });
  7. axl.fullName = 'William Rose'; // Now `axl.name.first` is "William"

这样,当我们设置fullName时,first name和last name也将会被设置。

Options

当我们新建一个Schema的时候,第一个参数可以规定Schema的数据结构(key: type),第二个参数可以定义可选options;如果定义的时候省略第二个参数,则可以使用set方法。

代码如下:

  1. new Schema({..}, options);
  2. // or
  3. var schema = new Schema({..});
  4. schema.set(option, value);

可以选择的options包括:

  1. autoIndex
  2. capped
  3. collection
  4. emitIndexErrors
  5. id
  6. _id
  7. minimize
  8. read
  9. safe
  10. shardKey
  11. strict
  12. toJSON
  13. toObject
  14. typeKey
  15. validateBeforeSave
  16. versionKey
  17. skipVersioning
  18. timestamps
  19. retainKeyOrder

详情可见:
http://mongoosejs.com/docs/guide.html#autoIndex

Models

  1. var schema = new mongoose.Schema({ name: 'string', size: 'string' });
  2. var Tank = mongoose.model('Tank', schema);

新建文档

文档就是Model的实例,有两种方式可以将数据保存到数据库。

  1. var Tank = mongoose.model('Tank', yourSchema);
  2. var small = new Tank({ size: 'small' });
  3. small.save(function (err) {
  4. if (err) return handleError(err);
  5. // saved!
  6. })
  7. // or
  8. Tank.create({ size: 'small' }, function (err, small) {
  9. if (err) return handleError(err);
  10. // saved!
  11. })

注意:如果不建立mongoose的连接,数据是无法保存的。每个Model都有一个绑定的连接。当开发者调用方法mongoose.model()的时候,这个Model将会使用默认的mongoose连接。

  1. mongoose.connect('localhost', 'gettingstarted');

如果你建立了一个常用的连接,可以用这个连接来创建model:

  1. var connection = mongoose.createConnection('mongodb://localhost:27017/test');
  2. var Tank = connection.model('Tank', yourSchema);

查询

查询方法包括: find, findById, findOne, where。

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

具体将在后文介绍。

删除

  1. Tank.remove({ size: 'large' }, function (err) {
  2. if (err) return handleError(err);
  3. // removed!
  4. });

更新

更新方法:findOneAndUpdate

Documents

更新方法

  1. Tank.findById(id, function (err, tank) {
  2. if (err) return handleError(err);
  3. tank.size = 'large'; // or tank.set({ size: 'large' });
  4. tank.save(function (err, updatedTank) {
  5. if (err) return handleError(err);
  6. res.send(updatedTank);
  7. });
  8. });

上面这个方法,会返回这个查找到的tank实例,如果我们不需要查找功能,只需要更新,则可以使用下面这个方法:

  1. Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);

如果我们需要返回实例,下面这个方法也是一个很好的选择:

  1. Tank.findByIdAndUpdate(id, { $set: { size: 'large' }}, { new: true }, function (err, tank) {
  2. if (err) return handleError(err);
  3. res.send(tank);
  4. });

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读