1. 程式人生 > >mongoose的增刪改查操作

mongoose的增刪改查操作

簡述:

    上篇博文我們簡單介紹了mongoose,並熟悉了mongoose的使用流程以及相關的一些概念性的東西,那麼這篇博文我們接著介紹使用Mongoose進行增刪修查的操作。

案例採用的MongoDB文件結構:     下面的所有操作都將依賴上一篇部落格的專案,並且新增一條age欄位;Doc如下:

儲存資料:

      Model提供了一個create方法來對資料進行儲存,語法結構為:Model.create(文件資料, callback)),例項如下:
userMode.create({
    name: userInfo.name,
    password: userInfo.password,
    age: userInfo.age
}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error(doc);     
    }
    我們開啟控制檯看一下日誌資訊:
{ __v: 0,
  name: 'tiny',
  password: '123456',
  age: 21,
  _id: 587d79e1a51c535f09b8cc40 }
    接下來我們再通過RoboMongo看一下是否已經真的寫入到了資料庫:

    OK,這條資料已經被寫入到資料庫中。接下來再來看一下Mongoose的刪除操作。

刪除操作:

   為了後續的其他操作現在再向MongoDB中插入了三條資料,如下:
    OK,現在我們進行刪除操作:obj.remove(查詢條件,callback);     示例程式碼如下:
//刪除使用者名稱為“tiny”的文件記錄
var conditions = {name: 'tiny'};
userMode.remove(conditions, function (error) {
    if (error) {
        console.error(error);
    } else {
        console.error("使用者刪除成功")
    }
});


//查詢使用者名稱為“tiny”的文件記錄是否還存在
userMode.findOne({name: "tiny"}, function (error, doc) {
    if (error) {
        console.error(error)
    } else {
        console.error("刪除後資料:", doc)
    }
});
    日誌資訊:
使用者刪除成功
刪除後資料: null

更新資料

   obj.update(查詢條件,更新物件,callback);例項程式碼如下:
//更新使用者名稱
var conditions = {name: request.body.name};
var updates = {$set: {name: "tiny"}};//將使用者名稱更新為“tiny”
userMode.update(conditions, updates, function (error) {
    if (error) {
        console.error(error);
    } else {
        console.error("更新使用者名稱成功")
    }
});
//查詢更新後的資料
userMode.findOne({name: "tinyjoy"}, function (error, doc) {
    if (error) {
        console.error(error)
    } else {
        console.error("更新後資料:", doc)
    }
});
    日誌資訊如下:
請求體資訊:
 { name: 'tinyjoy', password: '123456' }
更新使用者名稱成功
更新後資料: { _id: 587d7b4aa51c535f09b8cc41,
  name: 'tiny',
  password: '1234567',
  age: 14,
  __v: 0 }

查詢資料

    查詢操作永遠是資料庫操作的重中之重,因此mongoose提供操作操作的API相對其他操作也較為豐富。

    基本查詢 :find

       find基本查詢: obj.find(查詢條件,callback);這個查詢出所有滿足條件的結果值。
//查詢所有密碼為“123456”的文件記錄
userMode.find({"password": userInfo.password},function (error,docs) {
    if (error){
        console.error(error);
    }else{
        console.error("密碼為123456的個數:",docs.length)
        console.error("所有文件如下:\n",docs)
    }
});
    日誌資訊:
密碼為1234567的個數: 4
所有文件如下:
 [ { _id: 587d7b4aa51c535f09b8cc41,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d7b56a51c535f09b8cc42,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 },
  { _id: 587d7b71a51c535f09b8cc44,
    name: 'tinyjoy3',
    password: '1234567',
    age: 60,
    __v: 0 },
  { _id: 587d7e2463260b78550e8366,
    name: 'tinyjoy2',
    password: '1234567',
    age: 60,
    __v: 0 } ]
    從日誌可以看出查詢結果返回值為滿足條件的所有文件,並且返回了每個文件的所有屬性欄位值。那麼我們可不可以根據需要過略掉不必要的欄位呢?當然可以,接下來繼續。  find過濾查詢:     屬性過濾 find(Conditions,field,callback);
//查詢密碼為“1234567”的所有記錄,返回文件記錄只包含一個鍵值name
userMode.find({"password": userInfo.password},{name:"tinyjoy"},function (error,docs) {
    if (error){
        console.error(error);
    }else{
        console.error("查詢結果:",docs)
    }
});
    日誌資訊:
查詢結果: [ { _id: 587d7b4aa51c535f09b8cc41, name: 'tiny' },
  { _id: 587d7b56a51c535f09b8cc42, name: 'tinyjoy1' },
  { _id: 587d7b71a51c535f09b8cc44, name: 'tinyjoy3' },
  { _id: 587d7e2463260b78550e8366, name: 'tinyjoy2' } ]
    說明:我們只需要把顯示的屬性設定為大於零的數就可以,當然1是最好理解的,_id是預設返回,如果不要顯示加上("_id":0),但是,對其他不需要顯示的屬性且不是_id,如果設定為0的話將會拋異常或查詢無果。      findOne:         與find相同,但只返回單個文件,也就說當查詢到即一個符合條件的資料時,將停止繼續查詢,並返回查詢結果。findOne方法,只返回第一個符合條件的文件資料。         單條資料 findOne(Conditions,callback);
//查詢密碼為“1234567”的一條記錄
userMode.findOne({"password": userInfo.password},function (error,doc) {
    if (error){
        console.error(error);
    }else{
        console.error("查詢結果:",doc)
    }
});
日誌資訊:
查詢結果: { _id: 587d7b4aa51c535f09b8cc41,
  name: 'tiny',
  password: '1234567',
  age: 14,
  __v: 0 }
findById     與findOne相同,但它只接收文件的_id作為引數,返回單個文件。     單條資料 findById(_id, callback);
//查詢主鍵為”587d7b4aa51c535f09b8cc41“的一條記錄
userMode.findById('587d7b4aa51c535f09b8cc41',function (error,doc) {
    if (error){
        console.error(error);
    }else{
        console.error("查詢結果:",doc)
    }
});
    日誌資訊如下:
查詢結果: { _id: 587d7b4aa51c535f09b8cc41,
  name: 'tiny',
  password: '1234567',
  age: 14,
  __v: 0 }
    OK,簡單的find查詢基本上就這麼多了,但是有時候我們可能需要跟家高階的細緻的查詢。接下來我們一起學習一下條件查詢吧。

條件查詢:

通過操作符的使用,我們就可對資料進行更細緻性的查詢,一起來看一下吧。 "$lt"(小於),"$lte"(小於等於),"$gt"(大於),"$gte"(大於等於),"$ne"(不等於),"$in"(可單值和多個值的匹配),"$or"(查詢多個鍵值的任意給定值),"$exists"(表示是否存在的意思)"$all"。 通過一個demo熟悉一下"$lt"(小於),"$lte"(小於等於),"$gt"(大於),"$gte"(大於等於),"$ne"(不等於)的使用:
//查詢年齡小於18的所有記錄
userMode.find({"age": {"$lt": 18}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("查詢結果:", doc)
    }
});
//查詢年齡小於等於18的所有記錄
userMode.find({"age": {"$lte": 18}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("查詢結果:", doc)
    }
});
//查詢年齡不等於18的所有文件記錄
userMode.find({"age": {"$ne": 18}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("年齡不等於18的查詢結果:", doc)
    }
});
//查詢年齡大於18的所有文件記錄
userMode.find({"age": {"$gt": 18}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("年齡大於18的查詢結果:", doc)
    }
});
//查詢年齡大於等於18的所有文件記錄
userMode.find({"age": {"$gte": 18}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("年齡大於等於18的查詢結果:", doc)
    }
});
//查詢年齡大於等於18小於等於60所有文件記錄
userMode.find({"age": {"$gte": 18, "$lte": 60}}, function (error, doc) {
    if (error) {
        console.error(error);
    } else {
        console.error("年齡大於等於18小於等於60查詢結果:", doc)
    }
});
日誌資訊:
//查詢年齡小於等於18的所有記錄
userMode.find({"age":{"$lte":18}},function (error,doc) {
    if (error){
        console.error(error);
    }else{
        console.error("查詢結果:",doc)
    }
});

日誌資訊:

查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 } ]
查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 } ]
年齡不等於18的查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]
年齡大於18的查詢結果: [ { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]
年齡大於等於18的查詢結果: [ { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 },
  { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]
年齡大於等於18小於等於60查詢結果: [ { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 },
  { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]

"$in"和$nin’

    和$ne操作符相反,$in相當於包含、等於,查詢時查詢包含於指定欄位條件的資料。‘$nin’ "$in" 取反, 一個鍵不對應指定值,具體使用方法如下:
//查詢年齡等於18的所有記錄
userMode.find({age:{$in: 18}},function (error,doc) {
    if (error){
        console.error(error);
    }else{
        console.error("年齡為18的查詢結果:",doc)
    }
});

//查詢年齡等於18和19的所有記錄
userMode.find({age:{"$in":[18,19]}},function (error,docs) {
    if (error){
        console.error(error);
    }else{
        console.error("年齡為18和19的查詢結果:",docs)
    }
});

//查詢年齡不等於18和19的所有記錄
userMode.find({age:{"$nin":[18,19]}},function (error,docs) {
    if (error){
        console.error(error);
    }else{
        console.error("年齡不等於18和19的查詢結果:",docs)
    }
});
    日誌資訊:
年齡為18的查詢結果: [ { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 } ]
年齡為18和19的查詢結果: [ { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 },
  { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 } ]
年齡不等於18和19的查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 },

$Or或查詢:

//查詢年齡等於18或者名字為tiny所有記錄
userMode.find({"$or": [{"name": "tiny"}, {"age": 18}]}, function (error, docs) {
    if (error) {
        console.error(error);
    } else {
        console.error("$or查詢結果:", docs)
    }
});

//查詢年齡不等於18且名字不為tiny所有記錄
userMode.find({"$nor": [{"name": "tiny"}, {"age": 18}]}, function (error, docs) {
    if (error) {
        console.error(error);
    } else {
        console.error("$nor查詢結果:", docs)
    }
});
   日誌資訊:
$or查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 } ]
$nor查詢結果: [ { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]

exist查詢:

    $exists操作符,可用於判斷某些關鍵欄位是否存在來進行條件查詢。如下示例:
//查詢所有存在name屬性的文件
userMode.find({name: {$exists: true}}, function (error, docs) {
    if (error) {
        console.error(error);
    } else {
        console.error("exists查詢結果:", docs)
    }
});
    日誌資訊:
exists查詢結果: [ { _id: 587d8cd016dfd2dad509e7bb,
    name: 'tiny',
    password: '1234567',
    age: 14,
    __v: 0 },
  { _id: 587d8cdb16dfd2dad509e7bc,
    name: 'tinyjoy1',
    password: '1234567',
    age: 18,
    __v: 0 },
  { _id: 587d8ce516dfd2dad509e7bd,
    name: 'tinyjoy2',
    password: '1234567',
    age: 19,
    __v: 0 },
  { _id: 587d8ced16dfd2dad509e7be,
    name: 'tinyjoy3',
    password: '1234567',
    age: 25,
    __v: 0 },
  { _id: 587d8cf416dfd2dad509e7bf,
    name: 'tinyjoy4',
    password: '1234567',
    age: 60,
    __v: 0 } ]