假设以下代码都运行在
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
let db = mongoose.connection;
db.on('error', () => {
console.error('链接失败');
});
db.once('open', function () {
//下面讲到的所有代码都在这里运行
});
increment
增加文档版本号
//一开始的版本号_v是0
let query = Person.findOne({ name: 'noshower' }, function (err, person) {
person.increment();
person.save(function (err, parent) {
if (err) {
return console.error(err);
}
//现在_v是1
});
});
remove
从db中删除此文档。
Person.findOne({name:'noshower'},function(err,result){
if(err){
return console.error(result);
}
console.log(result);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower',age: 22,occupation: 'teacher',__v: 1 }
result.remove(function(err,result){
if(err){
return console.error(err);
}
Person.findById(result._id,function(err,result){
if(err){
return console.error(err);
}
console.log(result); //null 被删了
})
});
});
model(name)
返回另一个Model实例
let Schema = mongoose.Schema;
let schema = new Schema({
name: String,
age: Number,
occupation: String
});
let Person = mongoose.model('Person', schema);
let Woman = mongoose.model('Woman', schema);
Woman.model('Person').findById('587a0234a693c31ed46c4885',function(err,result){
if(err){
return console.error(err);
}
console.log(result);
});
save([fn])
保存此文档
let Schema = mongoose.Schema;
let schema = new Schema({
name: String,
age: Number,
occupation: String
});
let Person = mongoose.model('Person', schema);
let person = new Person({
name:'马克',
age:24,
occupation:'programmer'
});
person.save(function(err,product,numberAffected){
if(err){
return console.error(err);
}
console.log(numberAffected); //1
});
回调将接收三个参数,err如果发生错误,product是保存的product,numberAffected,当文档在数据库中找到和更新时,为1,否则为0。
fn callback是可选的。如果没有传递fn并且验证失败,那么将在用于创建此模型的连接上发出验证错误。
let db = mongoose.createConnection(..);
let schema = new Schema(..);
let Product = db.model('Product', schema);
db.on('error', handleError);
然而,如果你想要更多的本地错误处理,你可以添加一个error监听器到模型,并处理错误。
Product.on('error', handleError);
count
计算数据库集合中匹配的文档数。
let Schema = mongoose.Schema;
let schema = new Schema({
name: String,
age: Number,
occupation: String
});
let Person = mongoose.model('Person', schema);
Person.count({name:'noshower'},function(err,count){
if(err){
return console.error(err);
}
console.log(count);//2 说明数据库中,叫“noshower”的person有两个
});
create
用于创建新文档的快捷方式,如果有效,将自动保存到数据库。
Person.create({name:'Ali'},{name:'PengHu'},function(err,person1,person2){
if(err){
return console.error(err);
}
// 生成了两个文档
console.log(person1);//{ __v: 0, name: 'Ali', _id: 587a3c2e09a15c236e3fca37 }
console.log(person2);// { __v: 0, name: 'PengHu', _id: 587a3c2e09a15c236e3fca38 }
});
//传递一个数组
let array = [{
name:'高虎'
},{
name:'林俊杰'
}];
//此时回调函数接受到只有两个参数,一个是err,另一个person1。person2是undefined
Person.create(array,function(err,person1,person2){
if(err){
return console.error(err);
}
console.log(person1);//[ { __v: 0, name: '高虎', _id: 587a3d3cdf8cc623a034de09 },{ __v: 0, name: '林俊杰', _id: 587a3d3cdf8cc623a034de0a } ]
console.log(person2); // undefined
});
distinct
为不同操作创建查询
let Schema = mongoose.Schema;
let schema = new Schema({
name: String,
age: Number,
occupation: String
});
let Person = mongoose.model('Person',schema);
//找到数据库所有age=22的文档,并将name字段值以数组形式返回
Person.distinct('name',{age:22},function(err,result){
if(err){
return console.error(err);
}
console.log(result);//[ '李寻欢', '爱因斯坦', 'noshower' ]
});
let query = Person.distinct('url');
query.exec(function(){
console.log('ok')
});
find
查找文档
Model.find(conditions,fields,options,callback);
在发送命令之前,conditions将转换为它们各自的SchemaTypes。
//查找年龄至少24
Person.find({age:{$gte:24}},function(err,result){
if(err){
return console.error(err);
}
console.log(result);
});
//查找年龄至少24,仅选择name字段。
Person.find({age:{$gte:24}},'name',function(err,result){
if(err){
return console.error(err);
}
console.log(result);
});
// 查找年龄至少24,仅选择name字段,且跳过两个
Person.find({age:{$gte:22}},"name",{skip:2},function(err,result){
if(err){
return console.error(err);
}
console.log(result);
});
findById
按id查找单个文档。
Model.findById(id,fields,options,callback);
//选择name字段
Person.findById('587a3aae75b3c5758ca6877d',"name",function(err,person){
if(err){
return console.error(err);
}
console.log(person);
});
findByIdAndRemove
Model.findByIdAndRemove(id,[options],[callback])
查找匹配的文档,将其删除,将找到的文档(如果有)传递到回调。 如果传递了callback,则立即执行,否则返回Query对象。
//
A.findByIdAndRemove(id, options, callback) // 立即执行
executesA.findByIdAndRemove(id, options) // 返回query
QueryA.findByIdAndRemove(id, callback) // 立即执行
executesA.findByIdAndRemove(id) // 返回 query
QueryA.findByIdAndRemove() //返回query
findByIdAndUpdate
Model.findByIdAndUpdate(id, [update], [options], [callback])
找到匹配的文档,根据update变量更新它,传递任何选项,并将找到的文档(如果有)返回到回调。如果回调被传递,则查询立即执行,否则返回一个Query对象。
Options:
- new : true 返回修改的文档而不是原始文档。默认为true
//将new设置为false,将返回原始文档
Person.findByIdAndUpdate('587a3aae75b3c5758ca6877d',{name:'光环'},{new:false},function(err,person){
if(err){
return console.error(err);
}
console.log(person);
});
-
upsert:false 如果对象不存在,则创建对象。默认为false
//查找的id并不存在,将upsert设置为true,此时将创建对象 Person.findByIdAndUpdate('587a3aae75b3c5758ca687dd',{name:'光环'},{upsert:true},function(err,person){ if(err){ return console.error(err); } });
sort 如果按照条件找到多个文档,请设置排序顺序以选择要更新的文档
select 设置要返回的文档字段
Model.findOne
查找一个文档
Model.findOne(conditions, [fields], [options], [callback])
在发送命令之前,conditions将转换为它们各自的SchemaTypes。
//查找name是noshower的文档,返回name字段
Person.findOne({name:'noshower'},'name',function(err,person){
if(err){
return console.error(err);
}
console.log(person);
});
findOneAndRemove
Model.findOneAndRemove(conditions, [options], [callback])
查找匹配的一个文档,将其删除,将找到的文档(如果有)传递到callback。 如果回调函数被传递,则立即执行;否则返回一个Query对象。
findOneAndUpdate
Model.findOneAndUpdate([conditions], [update], [options], [callback])
remove
Model.remove(conditions, [callback])
从集合中删除文档。
// 删除所有name=“光环”的文档
Person.remove({name:'光环'},function(err){
if(err){
return console.error(err);
}
});
//remove如果在document上调用,表示删除这条文档。z在model上调用,表示删除所有匹配的文档。
person.remove(function(err,person){
})
要删除文档而不等待MongoDB的响应,不要传递回调,然后在返回的Query上调用exec:
let query = Person.remove({ _id: id });
query.exec();
此方法直接向MongoDB发送一个remove命令,不涉及Mongoose文档。因为不涉及Mongoose文档,所以不执行中间件(hook)。
update
Model.update(conditions, update, [options], [callback]
更新数据库中的文档而不返回它们。
//更新所有年龄在18岁以上的文档,职业更新为cleaner
Person.update({age:{$gte:18}},{occupation:'cleaner'},{multi:true},function(err,numberAffected,raw){
if(err){
return console.error(err);
}
console.log(numberAffected);
console.log(raw);
});
Valid options:
- safe (boolean)安全模式(默认为在schema中设置的值(true))
- upsert (boolean) 是否创建文档如果它不匹配(false)
- multi (boolean) 是否应更新多个文档(false)
- strict (boolean) 覆盖此更新的strict选项
- overwrite (boolean) 禁用仅更新模式,允许您覆盖doc(false)
回调函数接收(err,numberAffected,rawResponse)
- err 是错误如果错误发生
- numberAffected是Mongo报告的更新文档的数量
- rawResponse是Mongo的完整响应
where
创建查询,应用已通过的条件,并返回查询。
Model.where(path, [val])
User.find({age: {$gte: 21, $lte: 65}}, callback);
//也可以这样
User.where('age').gte(21).lte(65).exec(callback);