mongoose的增刪改查操作
阿新 • • 發佈:2018-12-24
簡述:
上篇博文我們簡單介紹了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 } ]