mongoose
获取mongoose
var mongoose = require('mongoose');
连接mongodb
mongoose.connect('mongodb://192.168.10.155/kang'); var db = mongoose.connection; //也可以用下面这种形式 var db = mongoose.createConnection('192.168.10.155','kang');
我们需要得到在连接数据库时 成功 或者失败时的通知
db.connection.on('error',function(err){
console.log("数据库连接失败" + err)
});
db.connection.on('connected',function(){
console.log("数据库连接成功 ... ...");
})
一旦连接被打开,回调将被调用。
使用 mongoose,任何事物都是 Schema 衍生而来的。
定义一个Schema 结构
var PersonSchema = mongoose.Schema({ // 前面的new 可加可不加啊 name:String, //定义一个属性name,类型为String age: Number // 定义一个属性age,类型是Number });
现在我们已经定义了一个 有name,age属性的Schema,下一步我们将 Schema 编译成一个 Model(模型)
var PersonModel = db.model('Person',PersonSchema); //mongoose.model(modelName, schema);
模型是我们构造文档的一个类,在这种情况下,每个文档都是我们在Schema中定义的属性和行为的实例。
var person1 = new PersonModel({ name:"kite", age : 18 })
console.log(person1.name)
现在我们为 PersonModel 增加一个 speak 行为(functionality,功能)。
PersonSchema.methods.speak = function(){ var na = this.name ? "my name is" + this.name : "i dont have name" console.log(na); }
函数被添加到 Schema的 method 属性并且被编译成模型的属性并被暴露在每个文档实例中。
var person1 = new PersonModel({ name:"ooo", age : 18 }) person1.speak();
数据还没有被保存到mongodb中,每一个文档(数据)都可以通过调用 save 方法保存到数据库中,回调的第一个参数是可能发生的错误。
person1.save(function(err,person1){ if(err) return console.log(err) person1.speak() });
Model提供了一个create方法来对数据进行保存,
UserModel.create({name:"pppp"},function(err,doc){ if(err){throw(err);} console.log(doc); })
文档的查找
我们可以通过 model 模型 查找所有的数据文档
PersonModel.find(function(err,person){ console.log(person); })
我们可以通过 属性 的值来过滤查询结果,mongoose 提供了丰富的查询机制。
PersonModel.find({name:/^ooo/,age:18},function(err,person){ console.log(person); })
也可以指定键值来进行查询
PersonModel.find({},['age'],function(err,person){ console.log(person); })
PersonModel.findOne 只返回单个文档。
PersonModel.findOne({age: 18},function(err,person){ console.log(person); })
也可以 通过 findById 来进行查询,它只接受文件 _id 作为参数,返回单个文档
PersonModel.findById('591d65d3b255f11c2c2abd90',function(err,person){ console.log(person); })
符合条件的文档个数
Model.count(conditions, callback) ,返回符合文档条件的个数
PersonModel.count({age: 18},function(err,count){ console.log(count); })
文档的删除
Model.remove(conditions, callback); 删除符合条件的文档
PersonModel.remove({age: 18},function(err,count){ console.log(count); })
Model.distinct(field, conditions, callback); 查询符合条件的文档并返回根据键分组的结果。
文档的更新
PersonModel.update
PersonModel.update({fname:'iiii'},{ $set: { fname: 'DDDDD',lname: 'HHHHH' }},function(err,count){ console.log(count); })
这种更新只能更新一个(符合条件的第一个);
当查询比较复杂,查询的条件比较多的时候,还可以使用 where
PersonModel .where('fname').equals('jin') .where('lname').equals('kang') .where('age').equals(20) .exec(function(err,res){ console.log(res[0].fname) })
使用正则的模糊查询
exports.searchbycon = function(content,callback){ var rule = new RegExp(content,'i'); ChatModel.find({message: {$regex: rule}},function(err,per){ if(err){ console.log(err); } if(per){ callback(per); }else{ callback(null); } }) }
查询中常用的一些操作符
$lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $ne 不等于
$in 可单值 和多个值的匹配 $or 查询多个键值的任意给定值 $exist 是否存在 $all
查询 name 为 test4 或者 age 为27的
TestModel.find({"$or":[{"name":"test4"},{"age":27}]},function(error,docs){ console.log(docs) });
查询所有存在name属性的文档
Model.find({name: {$exists: true}},function(error,docs){ console.log(docs); });
limit 对返回的结果的数量进行限制。如果匹配的数量不到限制数量,则返回匹配数量的结果,也就是说 limit 函数指定的是上限而不是下限
skip 函数的功能是略过指定数量的匹配结果,返回余下的查询结果。
sort 函数可以将查询结果数据进行排序操作,该函数的参数是一个或多个键值 对,键代表要排序的键名,值代表排序的方向
1 是升序, -1 是降序。