摘要:為安裝文件,無需再配置環(huán)境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒有。等于是每個默認配置的主鍵屬性,屬性名為可自己定義一個來覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過創(chuàng)建限于篇幅,本小節(jié)暫時寫到這里。
我的琴聲嗚咽,我的淚水全無。我把遠方的遠歸還草原。
- 海子《九月》
什么是Mongodb?
就是一個基于分布式文件存儲的數(shù)據(jù)庫,多的不說。
mongodb分了多個版本,Atlas【云版本】、Community Server【社區(qū)版本】、Enterprise Server【企業(yè)版本】......我選擇了社區(qū)版本安裝,Windows 7/Windows Server 2008 R2。version v3.4.0
下載地址: https://www.mongodb.com/downl...
注意: 右上角紅框可選擇你想要的版本,分別為穩(wěn)定版、早期版、開發(fā)板,左上角可選擇對應(yīng)版本集中的指定版本
可選擇zip/tgz/msi三種資源格式,zip和tgz下載之后解壓到對應(yīng)目錄,還需配置對應(yīng)的環(huán)境變量。msi為安裝文件,無需再配置環(huán)境變量。【本人采用msi,方便】
安裝完成之后,在mongodb目錄下新建文件夾testMongodb打開cmd,輸入
mongod --dbpath"D:mongodb estMongodb"
在瀏覽器訪問http://localhost:27017/,顯示如下,說明你不僅成功安裝了Mongodb還開啟了一個叫testMongodb的數(shù)據(jù)庫。
總得來說,比起mySql,SOLserver用mongodb創(chuàng)建數(shù)據(jù)庫和啟動服務(wù)都簡單許多。它就像新建了一個文件夾,在文件夾中分類存放了許多txt文件。你可以隨時增加或者刪除文件而不需要重啟服務(wù)。
可視化界面工具 RobonmongoRobonmongo是一個免費的輕量級的mongodb用戶圖形界面(GUI)。
官網(wǎng)下載地址:https://robomongo.org/
右上角Download,會出現(xiàn)多個版本。每個版本都有詳細的版本說明,可選擇一個你覺得合適的版本或者直接用最新版。
下載安裝之后,在打開mongodb服務(wù)的情況下,輸入mongodb服務(wù)器地址,即可連接到服務(wù)器。
可對數(shù)據(jù)進行你想做的任何操作,操作都很簡單,這里就略過了。
Node連接mongodbnode操作mongodb有以下npm包:
mongoose、mongodb、mongoskin、mongojs(作者并未查到除此之外的npm包,但不代表沒有)。
哪一個更好?個人看法僅供參考:
1.mongodb: 官方版,但寫起來太麻煩。 2.mongoskin:簡單,但是相關(guān)文檔太少,你甚至找不到實現(xiàn)聯(lián)表查詢的辦法 3.mongojs:比mongodb好一點,但是同樣文檔太少讓人極不滿意 4.mongoose:目前最好用的MongoDB ORM,文檔多(有官網(wǎng)),支持聯(lián)表查詢,而且還很規(guī)范
所以我選擇 mongoose。http://mongoosejs.com/
mongoose簡單搭建本節(jié)只講mongoose的基本概念和最基礎(chǔ)的項目搭建。CRUD(也就是增刪改查)的操作放在下一節(jié)。
簡單開始安裝mongoose只需要install一下就好了
$ npm install mongoose --save
假設(shè)我們已經(jīng)開啟了一個testMongodb的mongodb服務(wù),創(chuàng)建連接:
var mongoose = require("mongoose"); // 引入mongoose模塊 mongoose.connect("mongodb://localhost/testMongodb");// 連接到數(shù)據(jù)庫服務(wù) var db = mongoose.connection;//connection創(chuàng)建連接的實例 db.on("error", console.error.bind(console, "connection error:")); // 注冊連接失敗的事件監(jiān)聽 db.once("open", function (callback) { // 注冊連接成功的事件監(jiān)聽 once只觸發(fā)一次 // yay! });
once方法繼承自EventEmitter,EventEmitter是node事件觸發(fā)與事件監(jiān)聽器功能的封裝
到此,testMongodb還是一個空的數(shù)據(jù)庫,連表都沒有(為了方便理解collections解釋為表)。
要理解mongoose就要先理解下面三個名詞:
Schema: 一種以文件形式存儲的數(shù)據(jù)庫模型骨架,不具備數(shù)據(jù)庫的操作能力
Model:由Schema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫操作對
Entity:由Model創(chuàng)建的實體,他的操作也會影響數(shù)據(jù)庫
一句話概括:用Schema創(chuàng)建一個數(shù)據(jù)庫表骨架,通過這個表骨架生成一個可操作的MOdel,這個Model可以創(chuàng)建對應(yīng)的實體Entity,Entity即一條可操作的數(shù)據(jù),它們都是Object
便于理解可將Schema看做一張設(shè)計圖,MOdel是根據(jù)設(shè)計圖制造出來的模具,Entity就是模具做出來的物體。
Schema定義一個Schema
var PersonSchema = new mongoose.Schema({ name:String //定義一個屬性name,類型為String });
Schema.Type
Schema.Type是由Mongoose內(nèi)定的一些數(shù)據(jù)類型,基本數(shù)據(jù)類型都在其中,他也內(nèi)置了一些Mongoose特有的Schema.Type。支持自定義schema.type。
Schema.type有一下常見的類型:
//舉例: var ExampleSchema = new Schema({ name:String, binary:Buffer, //以字節(jié)的形式操作文件 living:Boolean, updated:Date, age:Number, mixed:Schema.Types.Mixed, //該混合類型等同于nested _id:Schema.Types.ObjectId, //主鍵 _fk:Schema.Types.ObjectId, //外鍵 array:[], arrOfString:[String], // 數(shù)據(jù)類型只能為String的數(shù)組 下同 arrOfNumber:[Number], arrOfDate:[Date], arrOfBuffer:[Buffer], arrOfBoolean:[Boolean], arrOfMixed:[Schema.Types.Mixed], arrOfObjectId:[Schema.Types.ObjectId], nested:{ stuff:String, // 一個擁有具體屬性的對象 }, populate:{ type: String, ref: "users" 用于支持populate查詢(聯(lián)表查詢) } });
Schema.Types.Mixed用戶定義可復(fù)用的數(shù)據(jù)格式,如果未定義則默認為{}。
Schema.Types.Mixed = { name: String } var AnySchema = new Schema({any:Schema.Types.Mixed}); // 等于 var AnySchema = new Schema({any:{name: String}});
ObjectId是每個Schema默認配置的主鍵屬性,屬性名為_id,可自己定義一個_id來覆蓋此屬性。
Schema的擴展
Schema的擴支持為其增加公共的實例方法和靜態(tài)方法,以便于Model和Entity的增刪改查等操作。
實例方法在生成對應(yīng)的實例(Entity層)之后才能調(diào)用,而靜態(tài)方法在model層就可以使用了。
實例方法
var PersonSchema = new Schema({name:String,type:String}); //查詢類似數(shù)據(jù) PersonSchema.methods.findSimilarTypes = function(cb){ return this.model("Person").find({type:this.type},cb); }
使用
var PersonModel = mongoose.model("Person",PersonSchema); var krouky = new PersonModel({name:"krouky",type:"前端工程師"}); krouky.findSimilarTypes(function(err,persons){ //persons中就能查詢到其他前端工程師 });
靜態(tài)方法:
PersonSchema.statics.findByName = function(name,cb){ this.find({name:new RegExp(name,"i"),cb}); } var PersonModel = mongoose.model("Person",PersonSchema); PersonModel.findByName("krouky",function(err,persons){ //找到所有名字叫krouky的人 });
Schema配置項
在new Schema();時,可以追加一個配置項來配置Schema.
var config = { name: String, sex: String } var options = { safe: true, // 安全屬性 默認為true strict: true,//嚴格配置(默認啟用),存入數(shù)據(jù)庫時,自動驗證 capped:1024,// 上線設(shè)置,限制一次操作的量 versionKey: "__v" // 版本鎖是Mongoose默認配置 autoIndex: "", //自動索引 } var ExampleSchema = new Schema(config,options);Model
Model模型,是經(jīng)過Schema構(gòu)造來的,除了Schema定義的數(shù)據(jù)庫骨架以外,還具有數(shù)據(jù)庫行為模型,他相當于管理數(shù)據(jù)庫屬性、行為的類。
//先創(chuàng)建Schema var TankSchema = new Schema({ name:"String", size:"String" }); //通過Schema創(chuàng)建Model var TankModel = mongoose.model("Tank",TankSchema);
有了對應(yīng)的模型就可以直接拿來操作數(shù)據(jù)庫
var tank = {"something",size:"small"}; TankModel.create(tank);Entity
Entity是model的實例,根據(jù)model創(chuàng)建出來的Entity并沒有存入數(shù)據(jù)庫,需要調(diào)用Entity的save方法來儲存。
Entity不具備Model的方法,所以只能用自己的方法。
需要注意的是,在新版本的mongoose文檔中,Entity為Documents。
//通過Model創(chuàng)建Entity var tankEntity = new TankModel("someother","size:big"); tankEntity.save();
限于篇幅,本小節(jié)暫時寫到這里。下一節(jié)再詳細講解query,Validation,Middleware等更加高級的操作。
參考文章:
http://mongoosejs.com/docs/ap...
http://www.runoob.com/mongodb...
http://ourjs.com/detail/53ad2...
https://cnodejs.org/topic/548...
https://www.cnblogs.com/jaxu/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90665.html
摘要:主要表現(xiàn)在復(fù)雜的語句事務(wù)支持等。僅支持,在等瀏覽器中,會出現(xiàn)樣式布局混亂的情況。將群群對應(yīng)的聊天記錄保存在數(shù)據(jù)庫。用戶進入群聊,則將其加入到對應(yīng)的中。文件大小不能超過通過模塊操作登錄注冊將用戶名作為唯一值。登錄支持自動登錄,將密碼保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...
摘要:連接開啟你的服務(wù)首先確保你已安裝了,并且配置了的環(huán)境變量。此時再進入文件夾,里面會有許多文件。創(chuàng)建連接新建一個任意目錄最好新建一個文件夾便于管理。連接錯誤安裝依賴包,運行此文件說明已成功連接到數(shù)據(jù)庫。 連接 開啟你的mongodb服務(wù) 首先確保你已安裝了mongodb,并且配置了mongodb的環(huán)境變量。在任意目錄(建議在非中文目錄)下新建database文件夾,在此文件夾下新建tes...
大吉大利,今晚吃雞! - PUBG 時隔多日,終于再次拾起這個拖了很久的項目。并不是因為沒時間,也不是因為這個項目對于我來說有多困難,就是一個字————懶。此項目的后臺,當然是選擇node.js來實現(xiàn)。作為一個前端,node.js比起java、php簡單多了。 node支持的webSocket 在npm中有很多支持webSocket的模塊,包括socket.io...
摘要:我在中寫了這段代碼在組件被創(chuàng)建時候?qū)?zhí)行此函數(shù)相當于進入頁面的自執(zhí)行使用方法監(jiān)聽屬性并執(zhí)行一個回調(diào)函數(shù)按道理在元素被創(chuàng)建的時候,會將監(jiān)聽到的值賦給并且打印。 天地不仁以萬物為芻狗,宇宙無義視眾生如螻蟻 ——蕭鼎和我 上一節(jié)列出了5個關(guān)鍵點,第一個路由已經(jīng)解決了,接下來解決第二個問題: 組件的通信問題 一、組件的關(guān)系 組件之間的關(guān)系無非就是兩種父子關(guān)系...
閱讀 982·2021-11-22 09:34
閱讀 2166·2021-11-11 16:54
閱讀 2202·2021-09-27 14:00
閱讀 946·2019-08-30 15:55
閱讀 1534·2019-08-29 12:46
閱讀 605·2019-08-26 18:42
閱讀 645·2019-08-26 13:31
閱讀 3189·2019-08-26 11:52