mongoose(貓鼬)

落霞與孤鶩齊飛發表於2019-02-16

mongoose@5.2.13 快速入門

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

相關文章