真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MongoDB教程

一、安裝
然后配置環(huán)境變量,找到bin目錄,復(fù)制路徑,path下面新建,然后copy目錄進(jìn)去,確定即可
配置“環(huán)境變量”,目的是在命令行中直接使用,而不需要輸入很長(zhǎng)的路徑進(jìn)入安裝目錄下再進(jìn)行使用了。
1、打開(kāi)終端,輸入mongod,啟動(dòng)MongoDB服務(wù)器
2、出現(xiàn)錯(cuò)誤,原因:C:\目錄下,沒(méi)有 data\db 文件夾,解決方法:在c盤下,新建data文件夾,在data下面再新建db文件夾;因?yàn)镸ongoDB在Windows中默認(rèn)的數(shù)據(jù)庫(kù)目錄是c:\data。如果在沒(méi)有該目錄的情況下,直接運(yùn)行mongod,就會(huì)報(bào)錯(cuò)誤
3、但是我們可以更改數(shù)據(jù)庫(kù)目錄
mongod --dbpath=D:\妙味課堂文件夾\190122Nodejs開(kāi)發(fā)博客系統(tǒng)\db --port=27017
--dbpath是指定數(shù)據(jù)庫(kù)存放目錄
--port是指數(shù)據(jù)庫(kù)端口號(hào)
4、重新輸入mongod,啟動(dòng)MongoDB服務(wù)器,默認(rèn)端口27017
5、成功啟動(dòng)MongoDB服務(wù)器后,再打開(kāi)一個(gè)命令行窗口輸入mongo,連接數(shù)據(jù)庫(kù),然后就可以進(jìn)行數(shù)據(jù)庫(kù)的一些操作。

創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設(shè)、成都做網(wǎng)站,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)稿等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

  • show dbs:查看已經(jīng)存在的數(shù)據(jù)庫(kù)
    MongoDB教程
  • db.version() :查看數(shù)據(jù)庫(kù)版本
  • show users:顯示用戶
  • use admin :進(jìn)入admin數(shù)據(jù)庫(kù),現(xiàn)在就可以使用這個(gè)庫(kù)了(如果沒(méi)有這個(gè)庫(kù),就會(huì)自動(dòng)新建這個(gè)庫(kù)),如果該新建的庫(kù)下面沒(méi)有數(shù)據(jù),默認(rèn)不顯示該庫(kù)
  • show collections:查看該數(shù)據(jù)庫(kù)下所有的集合
  • db:查看目前在哪個(gè)數(shù)據(jù)庫(kù)下,或者說(shuō)目前正在使用哪個(gè)數(shù)據(jù)庫(kù)

二、MongoDB與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別
MongoDB教程
比如:MySQL的表tables,MongoDB這里叫集合collections,集合里面的每一條數(shù)據(jù)叫做文件(document)

mongoDB是非關(guān)系型數(shù)據(jù)庫(kù),將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值對(duì)組成。mongoDB文檔類似于JSON對(duì)象,字段值可以包含其他文檔、數(shù)組及文檔數(shù)組。
一個(gè)mongoDB可以建立多個(gè)數(shù)據(jù)庫(kù)

三、創(chuàng)建數(shù)據(jù)庫(kù),插入數(shù)據(jù),查看數(shù)據(jù)
use user //新建數(shù)據(jù)庫(kù)
db.user.insert({ "name":"xiao" }) //增加一條數(shù)據(jù)
db.user.find() // 查看所有的數(shù)據(jù)
db.user.findOne() // 顯示第一條數(shù)據(jù)
db.user.update({ "name":"xiao" },{"name":"kate","age":"18"}) //修改數(shù)據(jù)
db.user.remove({ "name":"xiao" }) //刪除數(shù)據(jù)

四、用js文件寫mongo命令

//將用戶名和登錄時(shí)間插入log庫(kù),通過(guò)goTask.js操作,變量均使用var定義,不要使用let
var userName="jspang";    //聲明一個(gè)登錄名             
var timeStamp=Date.parse(new Date());     //聲明登錄時(shí)的時(shí)間戳  
var jsonDdatabase={"loginUnser":userName,"loginTime":timeStamp}; //組成JSON字符串
var db = connect('log');   //鏈接數(shù)據(jù)庫(kù),在命令行是使用use log,在js文件里是使用connect('log'),沒(méi)有即創(chuàng)建庫(kù)
db.login.insert(jsonDdatabase);  //插入數(shù)據(jù)
print('[demo]log  print success');  //沒(méi)有錯(cuò)誤顯示成功

//執(zhí)行文件,命令行:mongo goTask.js

五、批量插入
在操作數(shù)據(jù)庫(kù)時(shí)要注意兩個(gè)能力:
第一個(gè)是快速存儲(chǔ)能力。
第二個(gè)是方便迅速查詢能力。
注意一次插入不要超過(guò)48M,插入.zip和大圖片什么的盡量用靜態(tài)存儲(chǔ),MongoDB存儲(chǔ)靜態(tài)路徑就好,這也算是一個(gè)規(guī)則。
在工作中如果在循環(huán)插入和批量插入舉起不定,那就選批量插入吧,它會(huì)給我們更優(yōu)的性能體驗(yàn)。

九、在express里面使用mongoDB
1、理解mongoose的屬性、模型
2、mongoose是mongoDB的一個(gè)對(duì)象模型工具,是基于node-mongodb-native開(kāi)發(fā)的mongoDB的nodejs驅(qū)動(dòng),可以在異步的環(huán)境下執(zhí)行。同時(shí)它也是針對(duì)mongoDB操作的一個(gè)對(duì)象模型庫(kù),封裝了mongoDB對(duì)文檔的一些增刪改查等常用方法,讓nodejs操作mongoDB數(shù)據(jù)庫(kù)變得更加容易。
如果要通過(guò)mongoose創(chuàng)建一個(gè)集合并對(duì)其進(jìn)行增刪改查,就需要用到Schema(數(shù)據(jù)屬性模型)、Model、Entity
3、Schema (屬性)
在Mongoose里一切都是從Schema開(kāi)始的,每一個(gè)Schema都會(huì)映射到MongoDB的一個(gè)collection上。Schema定義了collection里documents的模板(或者說(shuō)是框架)。一種以文件形式存儲(chǔ)的數(shù)據(jù)庫(kù)模型骨架,不具備數(shù)據(jù)庫(kù)的操作能力,僅僅只是數(shù)據(jù)庫(kù)模型在程序片段中的一種表現(xiàn),可以說(shuō)是數(shù)據(jù)屬性模型(傳統(tǒng)意義的表結(jié)構(gòu)),又或者是集合的模型骨架?;緦傩灶愋陀凶址⑷掌谛?、數(shù)值型、布爾型、null、數(shù)組、內(nèi)嵌文檔等。

var blogSchema = new Schema({ // Schema頭字母大寫,因?yàn)镾chema是構(gòu)造函數(shù)
  title:  String,
  comments: [{ body: String, date: Date }], // 對(duì)象數(shù)組
  date: { type: Date, default: Date.now }, // 通過(guò)default設(shè)置默認(rèn)值
  hidden: Boolean,
  meta: { // 嵌套對(duì)象
    votes: Number,
    favs:  Number
  }
});

4、model (模型)
為了使用定義好的Schema,我們需要把blogSchema轉(zhuǎn)換成我們可以使用的model(其實(shí)是把Schema編譯成model,所以對(duì)于Schema的一切定義都要在compile之前完成)。也就是說(shuō)model才是我們可以進(jìn)行操作的handle。
由Schema構(gòu)造生成的模型,除了Schema定義的數(shù)據(jù)庫(kù)骨架以外,還具有數(shù)據(jù)庫(kù)操作的行為,類似于管理數(shù)據(jù)屬性、行為的類。

var Blog = mongoose.model('Blog', blogSchema);//編譯model

這樣我們就獲得了一個(gè)名為Blog的model了。生成model的同時(shí)MongoDB中對(duì)應(yīng)的collection也被建立了,model的名字是Blog,而collection的名字被默認(rèn)是model名字的復(fù)數(shù)也就是blogs(細(xì)心的小伙伴會(huì)發(fā)現(xiàn)不止變復(fù)數(shù)了,而且字母全部變小寫了,親測(cè)是這樣的)?!居蒘chema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫(kù)操作對(duì)】

//創(chuàng)建模型,可以用它來(lái)操作數(shù)據(jù)庫(kù)中的person集合,指的是整體。創(chuàng)建一個(gè)person集合
var PersonModel = db.model("person", PersonSchema);

person:數(shù)據(jù)庫(kù)中的集合名稱,當(dāng)我們對(duì)其添加數(shù)據(jù)時(shí)如果person已經(jīng)存在,則會(huì)保存到其目錄下,如果未存在,則會(huì)創(chuàng)建person集合,然后再保存數(shù)據(jù)。有了model,也就有了操作數(shù)據(jù)的能力。創(chuàng)建一個(gè)Model模型,需要指定兩點(diǎn):1,集合名稱;2,集合的Schema結(jié)構(gòu)對(duì)象。滿足這兩點(diǎn),就可以操作數(shù)據(jù)庫(kù)啦。

5、Schema和model的理解
不同于關(guān)系型數(shù)據(jù)庫(kù),MongoDB作為文檔型數(shù)據(jù)庫(kù),Scheme、model、collection、document是其中的四大元素。document是MongoDB里的基本存儲(chǔ)單位,collection是眾多同類document的集合。Schema定義了一類document的模板,讓這一類document在數(shù)據(jù)庫(kù)中有一個(gè)具體的構(gòu)成、存儲(chǔ)模式。而Schema僅僅是定義了Document是什么樣子的,至于生成document和對(duì)document進(jìn)行各種操作(增刪改查)則是通過(guò)相對(duì)應(yīng)的model來(lái)進(jìn)行的。

????需要說(shuō)明的是MongoDB中實(shí)際上只有collection和document,Schema和model不過(guò)是定義和生成前二者過(guò)程中的工具而已。

6、入門案例

//2 加載模塊
var mongoose = require("mongoose");
//3. 連接數(shù)據(jù)庫(kù) mongod 服務(wù)器端  mongo客戶端
//數(shù)據(jù)庫(kù)的名稱可以是不存在 創(chuàng)建一個(gè)zf數(shù)據(jù)庫(kù)
var db = mongoose.connect("mongodb://123.57.143.189:27017/zf");
//如果連接成功會(huì)執(zhí)行error回調(diào)
db.connection.on("error", function (error) {
    console.log("數(shù)據(jù)庫(kù)連接失敗:" + error);
});
//如果連接成功會(huì)執(zhí)行open回調(diào)
db.connection.on("open", function () {
    console.log("數(shù)據(jù)庫(kù)連接成功");
});
//定義一個(gè) schema,描述此集合里有哪些字段,字段是什么類型
//只有schema中有的屬性才能被保存到數(shù)據(jù)庫(kù)中
var PersonSchema = new mongoose.Schema({
    name : { type:String },
    home : { type:String },
    age  : { type:Number, default:0 },
    time : { type:Date, default:Date.now },
    email: { type:String,default:''}
});
//創(chuàng)建模型,可以用它來(lái)操作數(shù)據(jù)庫(kù)中的person集合,指的是整體
var PersonModel = db.model("person", PersonSchema);

//根據(jù)模型創(chuàng)建實(shí)體,是指的個(gè)體對(duì)象
var personEntity = new PersonModel({
    name : "zf",
    age  : 6,
    email: "zf@qq.com",
    home:'beijing'
});
//用save 方法把自己保存到數(shù)據(jù)庫(kù)中
personEntity.save(function(error,doc){
    if(error){
        console.log("error :" + error);
    }else{
        console.log(doc);
    }
});

7、mongoose基礎(chǔ)操作
①查詢:

db.Userl.find({conditions}, {options}, callback)
conditions Object類型 //查詢條件
options Object 類型 //查詢配置參數(shù)
callback Function //回調(diào)
db.teacher.find().pretty()  //加上pretty,返回結(jié)果更加易讀(在命令行展示效果)

查詢分為多種類型,如條件查詢、過(guò)濾查詢等。options省略或?yàn)閚ull,則返回所有屬性;options中把需要顯示的屬性設(shè)置為大于零的數(shù)則返回該屬性,_id不指定默認(rèn)返回,設(shè)置_id為0則不返回該屬性,其他字段不指定,默認(rèn)不返回

PersonModel.find({},function(error,docs){
    //conditions為空就顯示模型下所有數(shù)據(jù)
})
// 查詢Article模型下所有數(shù)據(jù)
db.Article.find({}, function(err, docs){ 
    if (err) {
            console.log('出錯(cuò)'+ err);
            return;
    }
    res.json(docs); // 以json格式輸出
});

MPersonModel不需要new了,通過(guò)var PersonModel = db.model("person", PersonSchema);獲取之后可以馬上使用了。Schema對(duì)象需要new一下。
查詢就是返回一個(gè)集合中文檔的子集,mongoose模型提供了find、findOne和findById方法用于文檔查詢
findOne查詢單條,當(dāng)查詢到一個(gè)符合條件的數(shù)據(jù)時(shí),就會(huì)停止繼續(xù)查詢并返回查詢結(jié)果。

//創(chuàng)建模型,可以用它來(lái)操作數(shù)據(jù)庫(kù)中的person集合,指的是整體
var PersonModel = db.model("person", PersonSchema);
//指定返回的字段 1表示 返回 0 不返回 ,,
//如果不指定的字段默認(rèn)不返回
//_id如果不指定也會(huì)返回,如果不想讓他返回需要顯式指定為0
PersonModel.find({},{name:1, age:1, _id:0},function(err,docs){   //find返回的是所有的數(shù)據(jù),格式是一個(gè)數(shù)組,數(shù)組里面的每一項(xiàng)是一個(gè)json
    console.log(docs);
})
//當(dāng)找到第一條匹配的記錄時(shí)就立刻返回,不再繼續(xù)查找了,返回單個(gè)對(duì)象
 //findOne返回的是匹配到的第一條數(shù)據(jù),格式是一個(gè)json
PersonModel.findOne({name:/^\w+9$/},{name:1, age:1, _id:0},function(err,doc){
    console.log(doc);
})
//按照ID進(jìn)行查詢
PersonModel.findById('56ee117356acb568054dd6d4',{name:1, age:1, _id:0},function(err,doc){
    console.log(doc);
})

②保存||增加
save是一個(gè)實(shí)例方法,使用時(shí)需要先 new Model() 來(lái)實(shí)例化

//根據(jù)模型創(chuàng)建實(shí)體,是指的個(gè)體對(duì)象
var personEntity = new PersonModel({
    name : "zf",
    age  : 6,
    email: "zf@qq.com",
    home:'beijing'
});
//用save 方法把自己保存到數(shù)據(jù)庫(kù)中
personEntity.save(function(error,doc){
    if(error){
        console.log("error :" + error);
    }else{
        console.log(doc);
    }
});
//保存一個(gè)用戶信息,userobj為你創(chuàng)建的文檔對(duì)象模型里的字段,需正確對(duì)應(yīng)傳入
const userobj={
    email: query,
    passworld: req.body.passworld,
    hash: hash,
    isregister: false,
    score: 5,
    sign: [],
    signdate: ''
}
new db.MUser(userobj).save(function(error){
    if (error) {
        res.status(500).send()
        return
    }
    res.json({statu: 200})
})

③數(shù)據(jù)更新
Model.update(查詢條件,更新對(duì)象,callback) 默認(rèn)更新一條文檔,若想全部更新,需要加上{multi:true}

//創(chuàng)建模型,可以用它來(lái)操作數(shù)據(jù)庫(kù)中的person集合,指的是整體
var PersonModel = db.model("person", PersonSchema);
//$set更新器 指定要更新的字段
var update = {$set : { age : 100 }};
//更新
//multi 更新匹配到的所有的記錄
PersonModel.update({name : 'zf'}, update,{multi:true}, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('Update success!');
    }
});

// 更新指定email字段數(shù)據(jù)條目下字段為content的內(nèi)容,如果不存在就創(chuàng)建該字段
db.Share.update({email: email},{$set:{content: newarr}}, function(err, docs){
    if (err) {
            res.status(500).send();
            return
    }
    res.json({statu: 200});
})

//$set 指定字段的值,這個(gè)字段不存在就創(chuàng)建它??梢允侨魏蜯ondoDB支持的類型。
Article.update({_id : id}, {$set : {views : 51, title : ‘修改后的標(biāo)題’ …}})

//$unset 同上取反,刪除一個(gè)字段
Article.update({views : 50}, {$unset : {views : ‘remove’}})
//執(zhí)行后: views字段不存在

//$inc 增減修改器,只對(duì)數(shù)字有效。
Article.update({_id : id}, {$inc : {views : 1}})

//$push 為字段為數(shù)組的內(nèi)容push數(shù)據(jù)
Article.update({_id : id}, {$push : {message : messageobj}})

//$pop從頭部或尾部刪除單個(gè)元素(1為從后面刪除,-1為從前面刪除)
db.Article.update(({_id: id), {$pop:{relationships: -1})

//__$pull__刪除滿足條件的元素,不止刪除一個(gè)
db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})

④數(shù)據(jù)刪除
Model.remove(查詢條件,callback)

PersonModel.remove({name:'zf'},function(err,docs){
    //result: { ok: 1, n: 3 }
    console.log(docs);
});

db.Course.remove({_id: req.body.id}, function(err, docs){
    if (err) {
            res.status(500).send();
            return
    }
    res.json({statu: 200})
})

⑤Limit()
limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
只顯示兩條記錄:db.student.find().limit(2).pretty() //顯示student集合中前兩條記錄
limit()中number值為空時(shí)代表全部查出
⑥skip()
skip()方法來(lái)跳過(guò)指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過(guò)的記錄條數(shù)。
跳過(guò)前三條記錄:db.student.find().pretty().skip(3)
只顯示第4條記錄:db.student.find().pretty().limit(1).skip(3) 或者 db.student.find().pretty().skip(3).limit(1)
⑦排序sort()
sort()方法可以通過(guò)參數(shù)指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
將Student集合中的文檔按照年齡升序排列:db.student.find().sort({age:1})
【注意】skip()與limit()的前后順序沒(méi)有要求,不管怎么放置他們執(zhí)行的順序都是先sort()后skip()最后limit()
⑧count
計(jì)算數(shù)據(jù)庫(kù)總數(shù)據(jù)數(shù)目
⑨⑩??

十、使用可視化圖形軟件robomongo:
MongoDB教程


網(wǎng)頁(yè)名稱:MongoDB教程
網(wǎng)站URL:http://weahome.cn/article/gjdidd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部