摘要:旨在為應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案??上攵?,大數(shù)據(jù)時代,數(shù)據(jù)庫中有萬條數(shù)據(jù)都算少的。是個怪胎,無法挑戰(zhàn)老牌數(shù)據(jù)庫,但是在大數(shù)據(jù)時代有自己的意義。使用我們自己的模塊,來實現(xiàn)數(shù)據(jù)庫插入。
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。
MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。是世界上最大的nosql(not only sql)數(shù)據(jù)庫。執(zhí)行mongodb數(shù)據(jù)庫需要mongod環(huán)境和mongo環(huán)境。
數(shù)據(jù)庫 傳統(tǒng)數(shù)據(jù)庫技術(shù)回顧概念:存儲數(shù)據(jù)的倉庫我們稱為數(shù)據(jù)庫。數(shù)據(jù)庫分為非關(guān)系型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫。關(guān)系型數(shù)據(jù)庫(Oracle,mysql,db2,...)往往以表結(jié)構(gòu)的形式進(jìn)行存儲。存儲數(shù)據(jù)用txt就行了,為什么要有數(shù)據(jù)庫?
理由1:數(shù)據(jù)庫有行、列的概念,數(shù)據(jù)有關(guān)系,數(shù)據(jù)不是散的
老牌數(shù)據(jù)庫,比如MySQL、SQLServer、Oracle、Access。這些數(shù)據(jù)庫,我們管他們叫結(jié)構(gòu)型數(shù)據(jù)庫。為什么?因為每個表中,都有明確的字段、每行記錄,都有這些字段。不能有的行有,有的行沒有。
理由2:數(shù)據(jù)庫能夠提供非常方便的接口,讓增刪改查變得簡單
我們的老牌數(shù)據(jù)庫,都無一例外的使用SQL語言,管理數(shù)據(jù)庫。
SQL就是structure query language
比如,查詢所有女生:
SELECT * FROM users WHERE sex = "女";
再比如,查詢所有女生,并且年齡20~24之間,并且在北京:
SELECT * FROM users WHERE sex = "女" AND age < 24 AND age >= 20 AND address = "北京"
理由3:數(shù)據(jù)庫不能自己玩兒,要給向PHP、.net、jsp等語言提供接口
用PHP這些語言,能夠向數(shù)據(jù)庫中增刪改查。
老牌數(shù)據(jù)庫,都是結(jié)構(gòu)型數(shù)據(jù)庫,現(xiàn)在出了什么問題?
比如,我們現(xiàn)在想往一個已經(jīng)有1000條數(shù)據(jù)的數(shù)據(jù)庫中增加一個字段‘是否為本地常住居民’
之前已經(jīng)存在的數(shù)據(jù),實際上不需要增加這個字段,因為這些用戶已經(jīng)填寫完畢表單了。不需要完善個人信息了。我們的想法是在今后注冊的用戶,需要添加‘是否為本地常住居民’信息。但是,我們剛才說了,所謂的字段,是表的一個結(jié)構(gòu)。所有的行都必須擁有,不能有的行有這個字段,有的行沒有這個字段。
可想而知,大數(shù)據(jù)時代,數(shù)據(jù)庫中有100萬條數(shù)據(jù)都算少的。我們?nèi)绻獎幼侄危馁M(fèi)時間。
非結(jié)構(gòu)型數(shù)據(jù)庫NoSQL應(yīng)運(yùn)而生。
NoSQL是個怪胎,無法挑戰(zhàn)老牌數(shù)據(jù)庫,但是在大數(shù)據(jù)時代有自己的意義。
非結(jié)構(gòu)型數(shù)據(jù)庫。沒有行、列的概念。用JSON來存儲數(shù)據(jù)。
集合就相當(dāng)于‘表’,文檔就相當(dāng)于‘行’
文檔就是JSON
因此,我們總結(jié)NOSQL數(shù)據(jù)庫在以下的這幾種情況下比較適用:1.數(shù)據(jù)模型比較簡單;2.需要靈活性更強(qiáng)的系統(tǒng);3.對數(shù)據(jù)庫性能要求較高;4.不需要高度的數(shù)據(jù)一致性;5.對于給定key,比較容易映射復(fù)雜值的環(huán)境。mongodb和mysql的區(qū)別
NoSQL不是銀彈,沒有資格挑戰(zhàn)老牌數(shù)據(jù)庫,但是在某些特定情況下,還是適合的。
前者非關(guān)系型數(shù)據(jù)庫,后者是關(guān)系型數(shù)據(jù)庫
mongodb中是以集合的形式來充當(dāng)mysql中的表結(jié)構(gòu)
mongodb中的數(shù)據(jù)是以文檔的形式進(jìn)行存儲
mongodb的特點(diǎn) mongodb的優(yōu)點(diǎn)面向文檔存儲的數(shù)據(jù)庫(BSON的數(shù)據(jù)格式)
有豐富的查詢指令
支持索引
具有分片系統(tǒng)
無模式
mongodb的缺點(diǎn)占用的空間比較大
不支持事務(wù)
對于windows來說,它不支持32位的系統(tǒng)
mongodb常用指令show dbs 查看當(dāng)前所有數(shù)據(jù)庫
use database_name 創(chuàng)建數(shù)據(jù)庫
db 查詢當(dāng)前使用的數(shù)據(jù)庫
db.stats() 查詢當(dāng)前使用的數(shù)據(jù)庫信息
db.dropDatabase() 刪除當(dāng)前數(shù)據(jù)庫
db.help() 獲取查詢幫助
db.database_name.help() 獲取指定數(shù)據(jù)庫查詢幫助
db.collection_name.find() 查詢集合的信息
db.createCollection(coll_name,options) 創(chuàng)建集合
db.getCollectionNames() 查詢所有集合
db.getCollection(coll_name) 查詢某一個特定集合
db.coll_name.drop() 對集合的刪除
db.printCollectionStats() 打印當(dāng)前數(shù)據(jù)庫中所有集合的狀態(tài)
db.coll_name.insert/insertMany/save/insertOne 添加一條/多條數(shù)據(jù)
db.coll_name.update(query,info,con,muti) 修改數(shù)據(jù)(query: 查詢的條件;info: 要更新的信息;con: 給異步操作提供擴(kuò)展;muti: 返回布爾類型 默認(rèn)false)(這里涉及到幾個特殊屬性$inc和$set 前者為相加后者為設(shè)置)
db.coll_name.remove(query) 刪除數(shù)據(jù)(query 刪除的條件)
對數(shù)據(jù)的查詢
db.coll_name.find() 查詢所有信息
db.coll_name.find({"age": 18}) 查詢某一條信息
db.coll_name.find({age: {$gt: 22}}) gt大于某一條件
db.coll_name.find({age: {$lt: 22}}) lt小于某一條件
db.coll_name.find({age: {$gte: 22}}) gt大于等于某一條件
db.coll_name.find({age: {$lte: 22}}) lte小于等于某一條件
db.coll_name.find({title: /好/}) 模糊查詢
集合與集合之間的關(guān)聯(lián)
async.waterfall([task],callback) (task:代表執(zhí)行的函數(shù)組,下一個函數(shù)總會繼承上一個函數(shù)的返回值;callback:回調(diào)函數(shù))
coll_name.findAndModify(data,sort,update,callback) (data:查詢的條件;sort:對返回的查詢結(jié)果進(jìn)行排序;update:對查詢的結(jié)果進(jìn)行更新;callback:回調(diào)函數(shù))
mongodb術(shù)語概念sql術(shù)語/概念 | mongodb術(shù)語/概念 | 解釋/說明 |
---|---|---|
database | database | 數(shù)據(jù)庫 |
table | collection | 數(shù)據(jù)庫表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | 表連接,mongodb不支持 | |
primary key | primary key | 主鍵,mongodb自動將_id字段設(shè)置為主鍵 |
把常用的增刪改查,都封裝成為module。
開發(fā)DAO:J2EE開發(fā)人員使用數(shù)據(jù)訪問對象(DAO)設(shè)計模式把底層的數(shù)據(jù)訪問邏輯和高層的商務(wù)邏輯分開,實現(xiàn)DAO模式能夠更加專注于編寫數(shù)據(jù)訪問代碼。
使用我們自己的DAO模塊,來實現(xiàn)數(shù)據(jù)庫插入。代碼變得簡單。
//這個模塊里面封裝了所有對數(shù)據(jù)庫的常用操作 var MongoClient = require("mongodb").MongoClient; var settings = require("../settings.js"); //不管數(shù)據(jù)庫什么操作,都是先連接數(shù)據(jù)庫,所以我們可以把連接數(shù)據(jù)庫 //封裝成為內(nèi)部函數(shù) function _connectDB(callback) { var url = settings.dburl; //從settings文件中,都數(shù)據(jù)庫地址 //連接數(shù)據(jù)庫 MongoClient.connect(url, function (err, db) { if (err) { callback(err, null); return; } callback(err, db); }); } //插入數(shù)據(jù) exports.insertOne = function (collectionName, json, callback) { _connectDB(function (err, db) { db.collection(collectionName).insertOne(json, function (err, result) { callback(err, result); db.close(); //關(guān)閉數(shù)據(jù)庫 }) }) }; //查找數(shù)據(jù),找到所有數(shù)據(jù)。args是個對象{"pageamount":10,"page":10} exports.find = function (collectionName, json, C, D) { var result = []; //結(jié)果數(shù)組 if (arguments.length == 3) { //那么參數(shù)C就是callback,參數(shù)D沒有傳。 var callback = C; var skipnumber = 0; //數(shù)目限制 var limit = 0; } else if (arguments.length == 4) { var callback = D; var args = C; //應(yīng)該省略的條數(shù) var skipnumber = args.pageamount * args.page || 0; //數(shù)目限制 var limit = args.pageamount || 0; //排序方式 var sort = args.sort || {}; } else { throw new Error("find函數(shù)的參數(shù)個數(shù),必須是3個,或者4個。"); return; } //連接數(shù)據(jù)庫,連接之后查找所有 _connectDB(function (err, db) { var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit).sort(sort); cursor.each(function (err, doc) { if (err) { callback(err, null); db.close(); //關(guān)閉數(shù)據(jù)庫 return; } if (doc != null) { result.push(doc); //放入結(jié)果數(shù)組 } else { //遍歷結(jié)束,沒有更多的文檔了 callback(null, result); db.close(); //關(guān)閉數(shù)據(jù)庫 } }); }); } //刪除 exports.deleteMany = function (collectionName, json, callback) { _connectDB(function (err, db) { //刪除 db.collection(collectionName).deleteMany( json, function (err, results) { callback(err, results); db.close(); //關(guān)閉數(shù)據(jù)庫 } ); }); } //修改 exports.updateMany = function (collectionName, json1, json2, callback) { _connectDB(function (err, db) { db.collection(collectionName).updateMany( json1, json2, function (err, results) { callback(err, results); db.close(); }); }) } exports.getAllCount = function (collectionName,callback) { _connectDB(function (err, db) { db.collection(collectionName).count({}).then(function(count) { callback(count); db.close(); }); }) }項目中使用mongodb
切換到指定項目 npm init生成package.json
npm install mongodb -g 全局安裝
npm install mongodb --save-dev 局部安裝
mongodb.js
var Mongodb = require("mongodb") // 連接到mongodb的服務(wù)端口 var server = new Mongodb.Server("localhost",27017,{auto_reconnect:true}) //創(chuàng)建數(shù)據(jù)庫 var db = new Mongodb.Db("cloud",server,{safe:true}) //連接數(shù)據(jù)庫 db.open((err,db) => { if(err) { console.log("連接數(shù)據(jù)庫失敗") } else { console.log("連接數(shù)據(jù)庫成功") } })
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19417.html
摘要:踩到許多坑,記錄下一些基于的東西吧首先。王大錘那么查詢的時候,如果要根據(jù)查詢班級怎么辦,的查詢也非常簡單。詳情可以查看官方文檔用法 剛接觸mongodb不久。踩到許多坑,記錄下一些基于spring-data-mongodb的東西吧 首先。應(yīng)該了解下什么情況下使用mongodb,什么情況下用mysql: 業(yè)務(wù)需要事物,使用mysql,因為mongodb不支持事物 數(shù)據(jù)量大,但是數(shù)據(jù)本身...
摘要:踩到許多坑,記錄下一些基于的東西吧首先。王大錘那么查詢的時候,如果要根據(jù)查詢班級怎么辦,的查詢也非常簡單。詳情可以查看官方文檔用法 剛接觸mongodb不久。踩到許多坑,記錄下一些基于spring-data-mongodb的東西吧 首先。應(yīng)該了解下什么情況下使用mongodb,什么情況下用mysql: 業(yè)務(wù)需要事物,使用mysql,因為mongodb不支持事物 數(shù)據(jù)量大,但是數(shù)據(jù)本身...
摘要:利用中間件實現(xiàn)異步請求,實現(xiàn)兩個用戶角色實時通信。目前還未深入了解的一些概念。往后會寫更多的前后臺聯(lián)通的項目。刪除分組會連同組內(nèi)的所有圖片一起刪除。算是對自己上次用寫后臺的一個強(qiáng)化,項目文章在這里。后來一直沒動,前些日子才把后續(xù)的完善。 歡迎訪問我的個人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時,利用業(yè)余時間寫的關(guān)于這兩個框架的訓(xùn)練,都相對簡單,有的...
摘要:學(xué)習(xí)已經(jīng)有三周了,是時候來一發(fā)學(xué)習(xí)總結(jié)啦。相關(guān)簡介是非關(guān)系型的數(shù)據(jù)庫。簡單在于,所有的都由大括號,中括號,以及對構(gòu)成。不同于,它是同步的。 學(xué)習(xí)mongoDB已經(jīng)有三周了,是時候來一發(fā)學(xué)習(xí)總結(jié)啦。以下是個人學(xué)習(xí)心得總結(jié),非官方,可能有紕漏和不準(zhǔn)確之處,歡迎指正。 相關(guān)簡介 1.mongoDB是非關(guān)系型(nosql)的數(shù)據(jù)庫。 2.mongoDB是無模式(schemaless)的數(shù)...
摘要:過程中的一些總結(jié)手動編譯安裝手動編譯的擴(kuò)展下使用第二個版本完善功能的版本。過程中的一些總結(jié)使用和搭建自己的機(jī)器人使用服務(wù)監(jiān)控進(jìn)程信息使用輸出內(nèi)容第三個版本重構(gòu)的版本。過程中的一些總結(jié)重新編譯支持 前端使用了Bootstrap模板,跨平臺自適應(yīng)。 1. web頁面 showImg(https://segmentfault.com/img/remote/1460000005819045);...
閱讀 1565·2023-04-26 01:36
閱讀 2730·2021-10-08 10:05
閱讀 2784·2021-08-05 09:57
閱讀 1544·2019-08-30 15:52
閱讀 1200·2019-08-30 14:12
閱讀 1320·2019-08-30 11:17
閱讀 3110·2019-08-29 13:07
閱讀 2429·2019-08-29 12:35