MongoDB是一個開源的NoSQL數據庫,相比MySQL那樣的關系型數據庫,它更顯得輕巧、靈活,非常適合在數據規模很大、事務性不強的場合下使用。同時它也是一個對象數據庫,沒有表、行等概念,也沒有固定的模式和結構,所有的數據以文檔的形式存儲(文檔,就是一個關聯數組式的對象,它的內部由屬性組成,一個屬性對應的值可能是一個數、字符串、日期、數組,甚至是一個嵌套的文檔。),數據格式就是JSON。 介紹了MongoDB,我們下面就要認識Mongoose了。 1. Mongoose是什么? Mongoose是MongoDB的一個對象模型工具,是基於node-mongodb-native開發的MongoDB nodejs驅動,可以在異步的環境下執行。同時它也是針對MongoDB操作的一個對象模型庫,封裝了MongoDB對文檔的的一些增刪改查等常用方法,讓NodeJS操作Mongodb數據庫變得更加靈活簡單。 2. Mongoose能做什么? Mongoose,因為封裝了對MongoDB對文檔操作的常用處理方法,讓NodeJS操作Mongodb數據庫變得easy、easy、So easy! 1. 安裝mongoose: npm install mongoose 2. 引用mongoose: var mongoose = require("mongoose"); 3. 使用"mongoose"連接數據庫: var db = mongoose.connect("mongodb://user:pass@localhost:port/database"); 4. 執行下面代碼檢查默認數據庫test,是否可以正常連接成功? var mongoose = require("mongoose"); var db = mongoose.connect("mongodb://127.0.0.1:27017/test"); db.connection.on("error", function (error) { console.log("數據庫連接失敗:" + error); }); db.connection.on("open", function () { console.log("------數據庫連接成功!------"); }); 在MongoDB中,多個Document可以組成Collection(以下簡稱集合),多個集合又可以組成數據庫。 我們想要操作MongoDB數據,那就得先要具備上面所說的包含數據的“文檔”,文檔又是什么意思呢,請看如下介紹。 文檔 —— 是MongoDB的核心概念,是鍵值對的一個有序集,在JavaScript里文檔被表示成對象。同時它也是MongoDB中數據的基本單元,非常類似於關系型數據庫管理系統中的行,但更具表現力。 集合 —— 由一組文檔組成,如果將MongoDB中的一個文檔比喻成關系型數據庫中的一行,那么一個集合就相當於一張表。 如果我們要通過Mongoose去創建一個“集合”並對其進行增刪改查,該怎么實現呢,到這里我們就要先了解Schema(數據屬性模型)、Model、Entity了。 Schema —— 一種以文件形式存儲的數據庫模型骨架,無法直接通往數據庫端,也就是說它不具備對數據庫的操作能力,僅僅只是數據庫模型在程序片段中的一種表現,可以說是數據屬性模型(傳統意義的表結構),又或着是“集合”的模型骨架。 那如何去定義一個Schema呢,請看示例: var mongoose = require("mongoose"); var TestSchema = new mongoose.Schema({ name : { type:String },//屬性name,類型為String age : { type:Number, default:0 },//屬性age,類型為Number,默認為0 time : { type:Date, default:Date.now }, email: { type:String,default:''} }); 基本屬性類型有:字符串、日期型、數值型、布爾型(Boolean)、null、數組、內嵌文檔等。 Model —— 由Schema構造生成的模型,除了Schema定義的數據庫骨架以外,還具有數據庫操作的行為,類似於管理數據庫屬性、行為的類。 如何通過Schema來創建Model呢,如下示例: var db = mongoose.connect("mongodb://127.0.0.1:27017/test"); // 創建Model var TestModel = db.model("test1", TestSchema); test1:數據庫中的集合名稱,當我們對其添加數據時如果test1已經存在,則會保存到其目錄下,如果未存在,則會創建test1集合,然后在保存數據。 Entity —— 由Model創建的實體,使用save方法保存數據,Model和Entity都有能影響數據庫的操作,但Model比Entity更具操作性。 使用Model創建Entity,如下示例: var TestEntity = new TestModel({ name : "Lenka", age : 36, email: "lenka@qq.com" }); console.log(TestEntity.name); // Lenka console.log(TestEntity.age); // 36 創建成功之后,Schema屬性就變成了Model和Entity的公共屬性了。 實例: var mongoose = require("mongoose"); var db = mongoose.connect("mongodb://127.0.0.1:27017/test"); var TestSchema = new mongoose.Schema({ name : { type:String }, age : { type:Number, default:0 }, email: { type:String }, time : { type:Date, default:Date.now } }); var TestModel = db.model("test1", TestSchema ); var TestEntity = new TestModel({ name : "helloworld", age : 28, email: "helloworld@qq.com" }); TestEntity.save(function(error,doc){ if(error){ console.log("error :" + error); }else{ console.log(doc); } });
1.find查詢: obj.find(查詢條件,callback);
Model.find({},function(error,docs){
//若沒有向find傳遞參數,默認的是顯示所有文檔
});
Model.find({ "age": 28 }, function (error, docs) {
if(error){
console.log("error :" + error);
}else{
console.log(docs); //docs: age為28的所有文檔
}
});
2. Model.create(文檔數據, callback))
Model.create({ name:"model_create", age:26}, function(error,doc){
if(error) {
console.log(error);
} else {
console.log(doc);
}
});
3. Entity.save(文檔數據, callback))
var Entity = new Model({name:"entity_save",age: 27});
Entity.save(function(error,doc) {
if(error) {
console.log(error);
} else {
console.log(doc);
}
});
4. obj.update(查詢條件,更新對象,callback);
var conditions = {name : 'test_update'};
var update = {$set : { age : 16 }};
TestModel.update(conditions, update, function(error){
if(error) {
console.log(error);
} else {
console.log('Update success!');
}
});
5. obj.remove(查詢條件,callback);
var conditions = { name: 'tom' };
TestModel.remove(conditions, function(error){
if(error) {
console.log(error);
} else {
console.log('Delete success!');
}
});
使用$gt(>)、$lt(<)、$lte(<=)、$gte(>=)操作符進行排除性的查詢,如下示例:
Model.find({"age":{"$gt":18}},function(error,docs){
//查詢所有nage大於18的數據
});
Model.find({"age":{"$lt":60}},function(error,docs){
//查詢所有nage小於60的數據
});
Model.find({"age":{"$gt":18,"$lt":60}},function(error,docs){
//查詢所有nage大於18小於60的數據
});
$ne(!=)操作符的含義相當於不等於、不包含,查詢時我們可通過它進行條件判定,具體使用方法如下:
Model.find({ age:{ $ne:24}},function(error,docs){
//查詢age不等於24的所有數據
});
Model.find({name:{$ne:"tom"},age:{$gte:18}},function(error,docs){
//查詢name不等於tom、age>=18的所有數據
});
和$ne操作符相反,$in相當於包含、等於,查詢時查找包含於指定字段條件的數據。具體使用方法如下:
Model.find({ age:{ $in: 20}},function(error,docs){
//查詢age等於20的所有數據
});
Model.find({ age:{$in:[20,30]}},function(error,docs){
//可以把多個值組織成一個數組
});
$or操作符,可以查詢多個鍵值的任意給定值,只要滿足其中一個就可返回,用於存在多個條件判定的情況下使用,如下示例:
Model.find({"$or":[{"name":"yaya"},{"age":28}]},function(error,docs){
//查詢name為yaya或age為28的全部文檔
});
$exists操作符,可用於判斷某些關鍵字段是否存在來進行條件查詢。如下示例
Model.find({name: {$exists: true}},function(error,docs){
//查詢所有存在name屬性的文檔
});
Model.find({telephone: {$exists: false}},function(error,docs){
//查詢所有不存在telephone屬性的文檔
});
結果排序:find(Conditions,fields,options,callback);
Model.find({},null,{sort:{age:-1}},function(err,docs){
//查詢所有數據,並按照age降序順序返回數據docs
});
限制數量:find(Conditions,fields,options,callback);
Model.find({},null,{limit:20},function(err,docs){
console.log(docs);
});
跳過數量:find(Conditions,fields,options,callback);
Model.find({},null,{skip:4},function(err,docs){
console.log(docs);
});
Schema添加屬性值
var mongoose = require('mongoose');
var TempSchema = new mongoose.Schema;
TempSchema.add({ name: 'String', email: 'String', age: 'Number' })