mongoose(猫鼬)

[email protected] 快速入门

const mongoose = require('mongoose');

/* 连接数据库 */
mongoose.connect('mongodb://localhost/mytest', {useNewUrlParser: true}); // 如果没有mytest这个数据库,则会自行创建
let db = mongoose.connection;
// 如果连接发生错误
db.on('error', ()=>{console.error('连接错误')});
// 如果连接成功
db.once('open', ()=>{console.log('已经连接')});

/* 注册一个集合kittens */
let kittySchema = new mongoose.Schema({
    name: String,
    age: Number
});
// 添加方法,被编译到Model原型并在每个文档实例上公开
kittySchema.methods.talk = function(){
    let greeting = this.name || '我还没有名字';
    console.log(`我叫${greeting}`);
};
let Kitten = mongoose.model('kittens', kittySchema);

/* 创建kittens集合的文档(实例,即一条数据)*/
let silence = new Kitten({
    name: 'silence',
    age: 1
});
// console.log(silence); 会自动加一个 _id 的属性

let fluffy = new Kitten({
    name: 'fluffy',
    age: .5
});

// 存到MongoDB上
silence.save();
fluffy.save((err, result)=>{
    if(err)return;
    fluffy.talk();
});

查询

第一个参数是查询条件,第二个参数指定结果输出的项目(可省略,就是全部输出)。

Kitten.find({name: /^flu/}, {name: 1, _id: 0},(err, result)=>{
    if(err)return;
    console.log(result);
})

基础查询

Kitten.findOne()

利用id的唯一性查询

Kitten.findById(_id,callback)

利用正则表达式模糊查询

let findCondition = {
    name: {
        $regex: /si/i
    }
}

其他条件

{
    age: {
        $gte: 18 // age >= 18
    }
}
  • $or或关系
  • $nor或关系取反
  • $gt大于
  • $gte大于等于
  • $lt小于
  • $lte小于等于
  • $ne不等于
  • $in在多个值范围内
  • $nin不在多个值范围内
  • $all匹配数组中多个值
  • $regex正则,用于模糊查询
  • $size匹配数组大小
  • $maxDistance范围查询,距离(基于LBS)
  • $mod取模运算
  • $near邻域查询,查询附近的位置(基于LBS)
  • $exists字段是否存在
  • $elemMatch匹配内数组内的元素
  • $within范围查询( 基于LBS)
  • $box范围查询,矩形范围(基于LBS)
  • $center范围醒询,圆形范围(基于LBS)
  • $centerSphere范围查询,球形范围(基于LBS) 
  • $slice查询字段集合中的元素(比如从第几个之后,第N到第M个元素)

查询数量

Kitten.count({/* 查询条件 */},(err,num)=>{})

分页查询(important)

let findCondition = {}; // 查询条件
let pageSize = 10; // 每页多少条
let currPage = 5; // 当前是多少页
let skipNum = (currPage-1)*pageSize; // 跳过条数。比如现在是第5页,就跳过前4页乘以每页10条。
let sort = {
    age: -1 // 按age降序排序
}
Kitten.find(findCondition,{_id:0,age:1,name:1})
      .skip(skipNum)
      .limit(pageSize)
      .sort(sort)
      .exec((err,result)=>{});

更新

Kitten.update({/*查询条件*/}, {/*更改项目*/}, {}, (err,res)=>{}); // 第三个参数设为`{multi: false}`只更新一个文档。

更改文档某一条(些)数据再调用save方法也可更新。

删除

Kitten.remove({/* 查询条件 */}, callback)

其他常用的增删改查api

  • Model.deleteMany()
  • Model.deleteOne()
  • Model.findById()
  • Model.findByIdAndDelete()
  • Model.findByIdAndRemove()
  • Model.findByIdAndUpdate()
  • Model.findOneAndDelete()
  • Model.findOneAndRemove()
  • Model.findOneAndUpdate()
  • Model.replaceOne()
  • Model.updateMany()
  • Model.updateOne()

解读Schema

mongoose的一切都是从Schema开始的。每个Scheam映射到MongoDB集合,并定义该集合中 documnet 的数据格式类型。

https://mongoosejs.com/docs

相关推荐