vip课程

Models

Models 是从 Schema 编译来的构造函数。 它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。

编译你的第一个 model

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

第一个参数是跟 model 对应的集合( collection )名字的 单数 形式。 Mongoose 会自动找到名称是 model 名字 复数 形式的 collection 。 对于上例,Tank 这个 model 就对应数据库中 tanks 这个 collection。.model() 这个函数是对 schema 做了拷贝(生成了 model)。 你要确保在调用 .model() 之前把所有需要的东西都加进 schema 里了!

构造 documents

Documents 是 model 的实例。 创建它们并保存到数据库非常简单:

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

var small = new Tank({ size: 'small' });
small.save(function (err) {
  if (err) return handleError(err);
  // saved!
})

// or

Tank.create({ size: 'small' }, function (err, small) {
  if (err) return handleError(err);
  // saved!
})

要注意,直到 model 使用的数据库连接( connection )被打开,tanks 才会被创建/删除。每个 model 都有一个绑定的连接。 如果 model 是通过调用 mongoose.model() 生成的,它将使用 mongoose 的默认连接。

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

如果自行创建了连接,就需要使用 connection 的 model() 函数代替 mongoose 的 model() 函数。

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

查询

用 mongoose 查询文档相当容易啦,它支持 MongoDB 的高级( rich )查询语法。 查询文档可以用 modelfind, findById, findOne, 和 where 这些静态方法。

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

要了解 Query api 的更多细节,可以查阅 querying 章节。

删除

modelremove 方法可以删除所有匹配查询条件( conditions )的文档。

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

更新

modelupdate 方法可以修改数据库中的文档,不过不会把文档返回给应用层。查阅 API 了解更多详情。

如果想更新单独一条文档并且返回给应用层,可以使用 findOneAndUpdate 方法。

更多

API 文档中包含了很多额外的方法,比如 count, mapReduce, aggregate, 还有 其他

下一步

现在我们已经介绍过了 Models,接下来是 Documents