mongoose.js 基础使用——Models

Models

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

编译model

var schema = 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 是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!
})

查询

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

find

基本语法:MyModel.find(conditions, [projection], [options], [callback])

  • conditions 查询条件
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]

执行完成后可以返回 Query 对象,下面是示例:

// name值john且年龄大于等于18
MyModel.find({ name: 'john', age: { $gte: 18 }});

// 查询名字中包含hn字母,并且仅返回 name与 friends 字段
MyModel.find({ name: /hn/i }, 'name friends', function (err, docs) { })

// 跳过10条查询
MyModel.find({ name: /hn/i }, null, { skip: 10 })

其中合法配置项有(不全):

  • sort 值1则表示升序,降序则设置为 -1。{key:1, title:-1}
  • limit 接受一个数字,表示指定读取记录条数
  • skip 接受一个数组,表示跳过条数再查找
  • lean 转换mongoose查询结果类型,从MongooseDocuments转换为JS Object,从而便于我们修改查询结果。(false)
findById

通过_id字段查找单个文档。findById(id)几乎等同于findOne({_id:id})
基本语法:MyModel.findById(id, [projection], [options], [callback])

  • id 依据数据库里_id
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]
MyModel.findById(id, function (err, adventure) {});
findOne

与find 类似,但查询条件是可选的,如果为null或为填写,将返回任意一条文档
基本语法:MyModel.findOne([conditions] [projection], [options], [callback])

  • conditions 查询条件
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]

删除

remove

modelremove 方法可以删除所有匹配查询条件( conditions )的文档。可以考虑是使用single选项,仅删除一条
基本语法:MyModel.remove(conditions, [callback])

  • conditions 删除条件
  • callback 删除回调,回调函数中传入一个形参[err,]
removeOne

同上,但仅会删除一条文档

deleteMany

同上,但不考虑single选项

更新

update

更新数据库中的一个文档而不返回它,该函数的执行会触发update()中间件。
基本语法:MyModel.update(conditions, doc, [options], [callback])

  • conditions 更新条件
  • doc 需要更新的字段值
  • options 更新配置项
  • callback 查询回调,回调函数中传入两个形参[err, docs]
MyModel.update({ name: 'Tobi' }, { ferret: true }, { multi: true }, function (err, raw) {
  if (err) return handleError(err);
  console.log('The raw response from Mongo was ', raw);
  /** {
  acknowledged: true,
  modifiedCount: 2,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 2
  }*/
});

其中合法的配置项有:

  • safe 安全模式(默认为模式中设置的值(true))
  • upsert 如果不匹配,是否创建文档(false)
  • multi 是否应更新多个文档(false)
  • runValidators
  • setDefaultsOnInsert
  • strict
  • overwrite 禁用 update-only 模式,允许你替换整个文档 (false)
  • err
  • rawResponse
updateMany

同上,但没有multi 选项

updateOne

同上,但仅更新一个

更多

count

统计数据库集合中匹配文档的数量。
基本语法:MyModel.count(conditions, [callback])

  • conditions 查询条件
  • callback 查询回调,回调函数中传入两个形参[err, count]
    示例:
MyModel.count({ type: 'jungle' }, function (err, count) {
  if (err) ..
  console.log('there are %d jungle adventures', count);
});

操作符

查询和投影运算符

比较查询运算符
  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
  • (!=) 不等于 $ne
  • (=) 等于 $eq
逻辑查询操作符
  • ($and) 多字段查询
  • ($or) 多字段查询 {$or : [{key01 : value01}, {key02 : value02}, ...]}
  • ($not)
  • ($nor)
元素查询操作符

赋值查询操作符

地理空间操作符

数组查询操作符

位运算操作符

投影操作符

混合查询操作符

更新操作符

字段更新操作符
  • $currentDate
  • $inc
  • $min
  • $max
  • $mul
  • $rename
  • $set
  • $setOnInsert
  • $unset
数组更新操作符
  • $(update)
  • $[]
  • $[]
  • $addToSet
  • $pop
  • $pull
  • $push
  • $pullAll
  • $each
  • $position
  • $slice
  • $sort
位运算更新操作符

聚合管道阶段

聚合管道操作符

模糊查询

查询 title 包含“教”字的文档:

MyModel.find({title:/教/})

查询 title 包含“教”字开头的文档:

MyModel.find({title:/^教/})

查询 title 包含“教”字结尾的文档:

MyModel.find({title:/教$/})

你可能感兴趣的:(mongoose.js 基础使用——Models)