在node中的mongodb及mongoose常見用法

飛翔的荷蘭人發表於2019-02-16

Mongoose是在node.js環境下對mongodb進行便捷操作的物件模型工具

安裝

一開始需要安裝node.js環境以及mongodb資料庫,然後建立mongdb資料資料夾並且啟動mongdb(windows安裝啟動mongodb)。

connect

connect 用於連線資料庫

mongoose.connect(uri(s), [options], [callback])
//url(s):資料庫地址,可以是多個,以`,`隔開
//options:可選,配置引數
//callback:可選,回撥

// 規則
mongoose.connect(`mongodb://資料庫地址(包括埠號)/資料庫名稱`)
// 連線mongodb示例
mongoose.connect(`mongodb://localhost:27017/db`);  //連線本地預設27017埠的mongodb
//連線指定使用者連線示例
mongoose.connect(`mongodb://使用者名稱:密碼@127.0.0.1:27017/資料庫名稱`)
//連線多個資料庫示例
//如果你的app中要連線多個資料庫,只需要設定多個url以,隔開,同時設定mongos為true
mongoose.connect(`urlA,urlB,...`, {
   mongos : true
})

建立schema & model

schema

schema可以理解為mongoose對錶結構的定義(不僅僅可以定義文件的結構和屬性,還可以定義文件的例項方法、靜態模型方法、複合索引等),每個schema會對映到mongodb中的一個collection,schema不具備運算元據庫的能力

const mongoose = require(`mongoose`);

const {Schema} = mongoose;
//  使用者物件模型
const userSchema = new Schema({
  name: {
    type: String, //型別
    default: Date.now // 預設值
  },
  avatar: {
        type: String,
        required: true //必須有值
  },
  user: String, 
  passworld: String,
  hash: String, 
  score: Number, 
  learn: Array, 
  message: Array, 
  star: Array, 
  sign: Array,
  signdate: String, 
  isregister: Boolean, 
});

schema欄位型別

  1. String
  2. Number
  3. Date
  4. Buffer
  5. Boolean
  6. Mixed
  7. ObjectId
  8. Array

Model

Model是由Schema編譯而成的假想(fancy)構造器,具有抽象屬性和行為。Model的每一個例項(instance)就是一個document。document可以儲存到資料庫和對資料庫進行操作。

//建立並匯出model
const db= {
  User: mongoose.model(`MUser`, muserSchema),
};
module.exports = db;

現在我們就完成了mongodb的資料連線,資料物件模型的建立。

操作mongodb資料庫

引入之前匯出的模型mongodb資料const db = require(`../models/db`)

mongodb查詢

1.find

find用來查詢並輸出該條件下的所有文件
db.Userl.find({conditions}, {options}, callback)
conditions Object型別 //查詢條件
options Object 型別 //查詢配置引數
callback Function //回撥

查詢操作示例
// 查詢Article模型下所有資料
db.Article.find({}, function(err, docs){
    if (err) {
            console.log(`出錯`+ err);
            return;
    }
    res.json(docs); // 以json格式輸出
});

// 查詢Article模型下state欄位為`publish`的內容,並且不輸出articleContent和user欄位內容。注!(1為只輸出該欄位,0為不輸出該欄位)
db.Article.find({state: "publish"}, {articleContent: 0,user: 0}, function(err, docs){
    if (err) {
            console.log(`出錯`+ err);
            return;
    }
    res.json(docs);
});
//查詢閱讀量大於500小於600的文章
db.Article.find(({views: {$gte: 500, $lte: 600}}), function(err, docs){
    if (err) {
            console.log(`出錯`+ err);
            return;
    }
    res.json({data:docs});
}) 
// 複雜條件查詢
//$ro 查詢該模型下的title欄位或者tag欄位,$regex 為正則匹配實現模糊查詢,$options為不區分大小寫
db.Article.find({ $or: [{title: {$regex: searchval, $options:`i`} }, { tag: {$regex: searchval, $options:`i` }}] }}, function(err, docs){
    if (err) {
            console.log(`出錯`+ err);
            return;
    }
    res.json({data:docs});
})
條件查詢
  1. $or ————— 或關係
  2. $nor ————- 或關係取反
  3. $gt ————— 大於
  4. $gte ————– 大於等於
  5. $lt —————- 小於
  6. $lte ————— 小於等於
  7. $ne ————— 不等於
  8. $in —————- 在多個值範圍內
  9. $nin ————– 不在多個值範圍內
  10. $all ————— 匹配陣列中多個值
  11. $regex ———– 正則,用於模糊查詢
  12. $size ————- 匹配陣列大小
  13. $maxDistance — 範圍查詢,距離(基於LBS)
  14. $mod ———— 取模運算
  15. $near ———— 鄰域查詢,查詢附近的位置(基於LBS)
  16. $exists ———- 欄位是否存在
  17. $elemMatch — 匹配內陣列內的元素
  18. $within ———- 範圍查詢(基於LBS)
  19. $box ————- 範圍查詢,矩形範圍(基於LBS)
  20. $center ———- 範圍醒詢,圓形範圍(基於LBS)
  21. $centerSphere – 範圍查詢,球形範圍(基於LBS)
  22. $slice ————- 查詢欄位集合中的元素(比如從第幾個之後,第N到第M個元素

2.findOne

與find類似,但只返回單個文件

db.Article.findOne({title: req.body.title}, function(err, docs){
    if (err) {
        console.log(`出錯`+ err);
    }
    res.json(docs);
})

3.findById

與findOne類似,但它接收文件的 _id 作為引數,返回單個文件。_id 可以是字串或 ObjectId 物件。

db.Article.findOne(id, function(err, docs){
    if (err) {
        console.log(`出錯`+ err);
    }
    res.json(docs);
})

4.count

返回符合條件的文件數。

db.Article.count(id, function(err, docs){
    if (err) {
        console.log(`出錯`+ err);
    }
    res.json(docs);
})

5.where

當查詢比較複雜時,用 where:

db.Article.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(function(err, docs){
    if (err) {
        console.log(`出錯`+ err);
    }
    res.json(docs);
}));

$where

有時我們需要在 mongodb 中使用 javascript 表示式進行查詢,這時可以用 find({$where : javascript}) 方式,$where 是一種快捷方式,並支援鏈式呼叫查詢。

db.MUser.$where(`this.firstname === this.lastname`).exec((err, docs) => {
    res.json({docs});
});

sort & skip & limit

sort為排序方法,為該欄位正序或者倒序輸出內容(-1為倒序)
skip為跳過多少條目
limit 為限制輸出多少條

// 實現文章分頁,按時間倒序排列輸出
db.Article.find({tag:req.params.labe}, function(err, docs){
    if (err)return;
    res.json(docs)
}).sort({date:-1}).skip(page*pagenum).limit(pagenum)

mongodb增加

save是一個例項方法,使用時需要先 new Model() 來例項化

//儲存一個使用者資訊,userobj為你建立的文件物件模型裡的欄位,需正確對應傳入
const userobj={
    email: query,
    passworld: req.body.passworld,
    hash: hash,
    isregister: false,
    score: 5,
    sign: [],
    signdate: ``
}
new db.MUser(userobj).save(function(error){
    if (error) {
        res.status(500).send()
        return
    }
    res.json({statu: 200})
})

mongodb刪除

remove

刪除資料方法

db.Course.remove({_id: req.body.id}, function(err, docs){
    if (err) {
            res.status(500).send();
            return
    }
    res.json({statu: 200})
})

mongodbg更新

update

更新資料方法

// 更新指定email欄位資料條目下欄位為content的內容,如果不存在就建立該欄位
db.Share.update({email: email},{$set:{content: newarr}}, function(err, docs){
    if (err) {
            res.status(500).send();
            return
    }
    res.json({statu: 200});
})

//$set 指定欄位的值,這個欄位不存在就建立它。可以是任何MondoDB支援的型別。
Article.update({_id : id}, {$set : {views : 51, title : ‘修改後的標題’ …}})

//$unset 同上取反,刪除一個欄位
Article.update({views : 50}, {$unset : {views : ‘remove’}})
//執行後: views欄位不存在

//$inc 增減修改器,只對數字有效。
Article.update({_id : id}, {$inc : {views : 1}})

//$push 為欄位為陣列的內容push資料
Article.update({_id : id}, {$push : {message : messageobj}})

//$pop從頭部或尾部刪除單個元素(1為從後面刪除,-1為從前面刪除)
db.Article.update(({_id: id), {$pop:{relationships: -1})

//__$pull__刪除滿足條件的元素,不止刪除一個
db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})

$set 指定欄位的值,這個欄位不存在就建立它。可以是任何MondoDB支援的型別。

Article.update({_id : id}, {$set : {views : 51, title : `修改後的標題` ...}})

$unset 同上取反,刪除一個欄位

Article.update({views : 50}, {$unset : {views : `remove`}})
//執行後: views欄位不存在

$inc 增減修改器,只對數字有效。

Article.update({_id : id}, {$inc : {views : 1}})

$push 為欄位為陣列的內容push資料

Article.update({_id : id}, {$push : {message : messageobj}})

$pop 從頭部或尾部刪除單個元素(1為從後面刪除,-1為從前面刪除)

db.Article.update(({_id: id), {$pop:{relationships: -1})

$pull 刪除滿足條件的元素,不止刪除一個

db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})

相關文章