Model.save
基于 entity 操作
var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};
var Entity = new Model(doc);
Entity.save(doc, function(error) {
// do something
});
Model.create
基于 model 操作
var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};
Model.create(doc, function(error) {
// do something
});
Model.find
Model.find(query, fields, options, callback) // fields 和 options 都是可选参数
简单查询
Model.find({ 'category': 5 }, function (err, docs) {
// docs 是查询的结果数组
});
只查询指定键的结果
Model.find({}, ['first', 'last'], function (err, docs) {
// docs 此时只包含文档的部分键值(first, last)
})
Model.findOne
与 Model.find 相同,但只返回单个文档
Model.findOne({ age: 5}, function (err, doc){
// doc 是单个文档
});
Model.findById
与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档。_id 可以是字符串或 ObjectId 对象。
Model.findById(obj._id, function (err, doc){
// doc 是单个文档
});
Model.count
返回符合条件的文档数。
Model.count({ age: 5}, function (err, data){
// todo
});
Model.remove
删除符合条件的文档。
Model.remove({ age: 5}, function (err, data){
// todo
});
`
Model.distinct
查询符合条件的文档并返回根据键分组的结果。
Model.distinct(field, conditions, callback);
Model.where
当查询比较复杂时,用 where:
Model
.where('age').gte(25)
.where('tags').in(['movie', 'music', 'art'])
.select('name', 'age', 'tags')
.skip(20)
.limit(10)
.asc('age')
.slaveOk()
.hint({ age: 1, name: 1 })
.run(callback);
Model.$where
有时我们需要在 mongodb 中使用 javascript 表达式进行查询,这时可以用 find({$where : javascript}) 方式,$where 是一种快捷方式,并支持链式调用查询。
Model.$where('this.firstname === this.lastname').exec(callback)
Model.update
使用 update 子句更新符合指定条件的文档,更新数据在发送到数据库服务器之前会改变模型的类型。
var conditions = { name: 'borne' },
update = { $inc: { visits: 1 }},
options = { multi: true };
Model.update(conditions, update, options, callback)
注意:为了向后兼容,所有顶级更新键如果不是原子操作命名的,会统一被按 $set 操作处理,例如:
var query = { name: 'borne' };
Model.update(query, { name: 'jason borne' }, options, callback)
// 会被这样发送到数据库服务器
Model.update(query, { $set: { name: 'jason borne' }}, options, callback)
查询 API
如果不提供回调函数,所有这些方法都返回 Query 对象,它们都可以被再次修改(比如增加选项、键等),直到调用 exec 方法。
var query = Model.find({});
query.where('field', 5);
query.limit(5);
query.skip(100);
query.exec(function (err, docs) {
// called when the `query.complete` or `query.error` are called
// internally
});
修改器和更新器
$inc 增减修改器,只对数字有效.下面的实例: 找到 age=22的文档,修改文档的age值自增1
Model.update({'age':22}, {'$inc':{'age':1} }); // 执行后: age=23
$set 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
Model.update({'age':22}, {'$set':{'age':'haha'}}); // 执行后: age='haha'
$unset 同上取反,删除一个键
Model.update({'age':22}, {'$unset':{'age':'haha'} }); // 执行后: age键不存在
数组修改器:
$push 给一个键push一个数组成员,键不存在会创建
Model.update({'age':22}, {'$push':{'array':10} }); // 执行后: 增加一个 array 键,类型为数组, 有一个成员 10
$addToSet 向数组中添加一个元素,如果存在就不添加
Model.update({'age':22}, {'$addToSet':{'array':10} }); // 执行后: array中有10所以不会添加
$each 遍历数组, 和 $push 修改器配合可以插入多个值
Model.update({'age':22}, {'$push':{'array':{'$each': [1,2,3,4,5]}}}); // 执行后: array : [10,1,2,3,4,5]
$pop 向数组中尾部删除一个元素
Model.update({'age':22}, {'$pop':{'array':1}}); // 执行后: array : [10,1,2,3,4] tips: 将1改成-1可以删除数组首部元素
$pull 向数组中删除指定元素
Model.update({'age':22}, {'$pull':{'array':10} }); // 执行后: array : [1,2,3,4] 匹配到array中的10后将其删除
条件查询:
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
Model.find({'age':{ '$get':18 , '$lte':30 }}); // 查询 age 大于等于18并小于等于30的文档
或查询 OR:
$in 一个键对应多个值
$nin 同上取反, 一个键不对应指定值
$or 多个条件匹配, 可以嵌套 $in 使用
$not 同上取反, 查询与特定模式不匹配的文档
Model.find({'age':{ '$in':[20,21,22.'haha']}}); // 查询 age等于20或21或21或'haha'的文档
Model.find({"$or" : [ {'age':18} , {'name':'xueyou'}]}); // 查询 age等于18 或 name等于'xueyou' 的文档
类型查询:
null 能匹配自身和不存在的值, 想要匹配键的值 为null, 就要通过 '$exists' 条件判定键值已经存在
$exists (表示是否存在的意思)
Model.find('age' : { '$in' : [null] , 'exists' : true } ); // 查询 age值为null的文档
Model.find({name: {$exists: true}}, function(error,docs){
//查询所有存在name属性的文档
});
Model.find({telephone: {$exists: false}}, function(error,docs){
//查询所有不存在telephone属性的文档
});
正则表达式:
MongoDb 使用 Prel兼容的正则表达式库来匹配正则表达式
Model.find( {'name' : /joe/i } ) // 查询name为 joe 的文档, 并忽略大小写
Model.find( {'name' : /joe?/i } ) // 查询匹配各种大小写组合
var qs = 'search'
var reg = new RegExp(qs, 'i') // 不区分大小写
var data = {
name: qs
}
Model.find(data)
查询数组:
Model.find({'array':10} ); // 查询 array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到
Model.find({'array[5]':10} ); // 查询 array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到
$all 匹配数组中多个元素
Model.find({'array':[5,10]} ); // 查询 匹配array数组中 既有5又有10的文档
$size 匹配数组长度
Model.find({'array':{"$size" : 3} } ); // 查询 匹配array数组长度为3 的文档
$slice 查询子集合返回
Model.find({'array':{"$skice" : 10} } ); // 查询 匹配array数组的前10个元素
Model.find({'array':{"$skice" : [5,10] } } ); // 查询 匹配array数组的第5个到第10个元素