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
model
的 remove
方法可以删除所有匹配查询条件( 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)
- $[]
- $[<identifier>]
- $addToSet
- $pop
- $pull
- $push
- $pullAll
- $each
- $position
- $slice
- $sort
位运算更新操作符
略
聚合管道阶段
略
聚合管道操作符
略
模糊查询
查询 title 包含“教”字的文档:
MyModel.find({title:/教/})
查询 title 包含“教”字开头的文档:
MyModel.find({title:/^教/})
查询 title 包含“教”字结尾的文档:
MyModel.find({title:/教$/})