nodejs操作mongodb增删改查
1. Mac系統(tǒng)上安裝
使用Homebrew安裝
$ brew updata // 更新Homebrew的package數(shù)據(jù)庫(kù) $ brew install mongodb2. 啟動(dòng)MongoDB
$mongod --config /usr/local/etc/mongod.conf // sudo mongod3. 使用MongoDB shell
$ mongoMongoDB是什么?
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫(xiě)。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。?
特點(diǎn)是:?
高性能、易部署、易使用、存儲(chǔ)數(shù)據(jù)方便
MongoDB概念
| database | database | 數(shù)據(jù)庫(kù) |
| table | collection | 數(shù)據(jù)庫(kù)表/集合 |
| row | document | 數(shù)據(jù)記錄行/文檔 |
| column | field | 數(shù)據(jù)字段/域 |
| index | index | 索引 |
| table joins | ? | 表連接,MongoDB不支持 |
| primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
1. 數(shù)據(jù)庫(kù)
- 一個(gè)mongodb中可以建立多個(gè)數(shù)據(jù)庫(kù)
- MongoDB的默認(rèn)數(shù)據(jù)庫(kù)為“db”,該數(shù)據(jù)庫(kù)存儲(chǔ)在data目錄中。
- MongoDB的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫(kù),每一個(gè)都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫(kù)也放置在不同的文件中
數(shù)據(jù)庫(kù)的命名:通過(guò)標(biāo)識(shí)符,使用utf8字符串
- 非空
- 不允許出現(xiàn)特殊字符$,/
- 全部小寫(xiě),最多64個(gè)字節(jié)
- 有一些特殊保留數(shù)據(jù)庫(kù),如local、admin、config,命名時(shí)避免使用
2. 文檔
文檔是一個(gè)鍵值(key-value)對(duì)(即BSON)。MongoDB的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類(lèi)型,這與關(guān)系型數(shù)據(jù)庫(kù)有很大的區(qū)別,也是MongoDB非常突出的特點(diǎn)。
3. 集合
集合就是 MongoDB文檔組,類(lèi)似于RDBMS(關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))中的表格。?
集合存在于數(shù)據(jù)庫(kù)中,集合沒(méi)有固定的結(jié)構(gòu),這意味著對(duì)集合可以插入不同格式和類(lèi)型的數(shù)據(jù),但通常情況下我們插入的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性。
結(jié)合的命名
- 不能是空字符串
- 不允許出現(xiàn)- 0
- 不能以system.開(kāi)頭,這是系統(tǒng)保留的前綴
- 不能包含保留字,$
4.MongoDB數(shù)據(jù)類(lèi)型
| null | 用于表示空值或者不存在的字段{“x”,null} |
| 布爾 | ‘true’和’false’{“x”,true} |
| 32位整數(shù) | Shell中這個(gè)類(lèi)型不可用,MongoDB在控制臺(tái)使用JS引擎進(jìn)行輸入,而JS僅支持64位浮點(diǎn)數(shù),所以32位整數(shù)將會(huì)被自動(dòng)轉(zhuǎn)義 |
| 64位整數(shù) | Shell中這個(gè)類(lèi)型不可用, 64位整數(shù)與32位整數(shù)一樣,在MongoDB控制臺(tái)使用時(shí),會(huì)轉(zhuǎn)義成64位浮點(diǎn)數(shù) |
| 64位浮點(diǎn)數(shù) | Shell中的數(shù)字都是這種類(lèi)型,下面是浮點(diǎn)數(shù){“x”:3.14}、{“x”:3} |
| 字符串 | UTF-8字符串都可表示為字符串類(lèi)型的數(shù)據(jù){“x”:”foobar”} |
| 符號(hào) | Shell不支持這種類(lèi)型,將自動(dòng)轉(zhuǎn)義成字符串 |
| 對(duì)象ID | 對(duì)象id是文檔的12字節(jié)的唯一ID,時(shí)間戳 |
| 日期 | 日期類(lèi)型存儲(chǔ)的是從標(biāo)準(zhǔn)紀(jì)元開(kāi)始的毫秒數(shù){“x”:new Date()} |
| 正則表達(dá)式 | 文檔中可以包含正則表達(dá)式,其正則表達(dá)式采用JS語(yǔ)法來(lái)表示{“x”:/foobar/i} |
| 代碼 | 文檔中可以包含js代碼{“x”:function(){…}} |
| 二進(jìn)制數(shù)據(jù) | 二進(jìn)制數(shù)據(jù)可以由任意字節(jié)的串組成,不過(guò)Shell無(wú)法使用 |
| 最大值 | BSON包括一個(gè)特殊類(lèi)型,表示可能的最大值Shell無(wú)法使用 |
| 最小值 | BSON包括一個(gè)特殊類(lèi)型,表示可能的最小值Shell無(wú)法使用 |
| 未定義 | 文檔中也可以使用未定義類(lèi)型{“x”:undefined} |
| 數(shù)組 | 值的集合或者列表可以表示成數(shù)組{“x”:[“a”,”b”,”c”]} |
| 內(nèi)嵌文檔 | 文檔可以包含別的文檔{“x”:{“foo”:”bar”}} |
MongoDB操作
1. 數(shù)據(jù)庫(kù)常用命名
help?
- db.help()
- db.test.help()
- db.test.find().help()
- use music
- show dbs
- db/db.getName()
- db.stats()
- db.version()
- db.getMongo()
- db.dropDatabase()
2. shell操作數(shù)據(jù)庫(kù)
> use music switched to db music > show dbs // 當(dāng)前列表里沒(méi)有music數(shù)據(jù)庫(kù),因?yàn)闆](méi)有數(shù)據(jù) > db.albums.insertOne({'title':'生命之花'}) {"acknowledged" : true,"insertedId" : ObjectId("591b158a71d7222a7a0d7f60") } > db.albums.find() { "_id" : ObjectId("591b158a71d7222a7a0d7f60"), "title" : "生命之花" } > show dbs //插入數(shù)據(jù)后,有music數(shù)據(jù)庫(kù) music 0.000GB > db music > db.getName() music > db.stats() {"db" : "music","collections" : 1,"views" : 0,"objects" : 1,"avgObjSize" : 46,"dataSize" : 46,"storageSize" : 16384,"numExtents" : 0,"indexes" : 1,"indexSize" : 16384,"ok" : 1 } > db.version() 3.4.3 > db.getMongo() connection to 127.0.0.1:27017 > db.dropDatabase() //刪除數(shù)據(jù)庫(kù) { "dropped" : "music", "ok" : 1 }Collection 聚集集合操作
1. 創(chuàng)建一個(gè)聚集集合
db.createCollection(“collName”, {size: 20, capped: true, max: 100});?
db.collName.isCapped(); //判斷集合是否為定容量
capped:true 將集合固定大小,可以提高訪問(wèn)數(shù)據(jù)庫(kù)的效率,插入數(shù)據(jù)時(shí),會(huì)自動(dòng)進(jìn)行順序管理
> db.albums.isCapped() //判斷集合是否為定容量 truesize的優(yōu)先級(jí)大于max
2. 得到指定名稱(chēng)的聚集集合
> db.getCollection('albums') music.albums3. 得到當(dāng)前db的所有聚集集合
> db.getCollectionNames() [ "albums" ]4. 顯示當(dāng)前db所有聚集的狀態(tài)
db.printCollectionStats()添加、修改與刪除集合數(shù)據(jù)
1. 添加
> db.albums.insertOne({title:'生命之花'}) > db.albums.insertMany([{title:'再見(jiàn)理想'},{title:'飛船'}]) > db.albums.insert([{title:'光輝歲月'},{title:'hello'}]) > db.albums.save({title:'21'})2. 修改
修改所有數(shù)據(jù)
db.albums.updateMany({},{$set:{artist:'adele'}}) > db.albums.find() { "_id" : ObjectId("591b1d7871d7222a7a0d7f61"), "title" : "生命之花", "artist" : "adele" } { "_id" : ObjectId("591b1e0071d7222a7a0d7f62"), "title" : "再見(jiàn)理想", "artist" : "adele" } { "_id" : ObjectId("591b1e0071d7222a7a0d7f63"), "title" : "飛船", "artist" : "adele" } { "_id" : ObjectId("591b1eac71d7222a7a0d7f64"), "title" : "光輝歲月", "artist" : "adele" } { "_id" : ObjectId("591b1eac71d7222a7a0d7f65"), "title" : "hello", "artist" : "adele" } { "_id" : ObjectId("591b1ee971d7222a7a0d7f66"), "title" : "21", "artist" : "adele" }修改一條數(shù)據(jù)
>db db.albums.updateMany({title:'光輝歲月'},{$set:{artist:'Beyond'}}) { "_id" : ObjectId("591b1eac71d7222a7a0d7f64"), "title" : "光輝歲月", "artist" : "Beyond" }3. 刪除
刪除一條記錄
> db.albums.deleteOne({artist:'adele'}) { "acknowledged" : true, "deletedCount" : 1 } > db.albums.remove({artist:'adele'},true) WriteResult({ "nRemoved" : 1 })刪除多條記錄
> db.albums.deleteMany({artist:'adele'}) { "acknowledged" : true, "deletedCount" : 3 } > db.albums.remove({}) WriteResult({ "nRemoved" : 1 })4. 查詢修改刪除
db.users.findAndModify({query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}},remove: true }); db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}},remove: true });| query | 查詢過(guò)濾條件 | {} |
| sort | 如果多個(gè)文檔符合查詢過(guò)濾條件,將以該參數(shù)指定的排列方式選擇出排在首位的對(duì)象,該對(duì)象將被操作 | {} |
| remove | 若為true,被選中對(duì)象將在返回前被刪除 | N/A |
| update | 一個(gè) 修改器對(duì)象 | N/A |
| new | 若為true,將返回修改后的對(duì)象而不是原始對(duì)象。在刪除操作中,該參數(shù)被忽略。 | FALSE |
| upsert | 創(chuàng)建新對(duì)象若查詢結(jié)果為空 | FALSE |
聚集集合查詢
1. 查詢所有記錄
db.userInfo.find();?
相當(dāng)于:select* from userInfo;
2.查詢?nèi)ブ睾髷?shù)據(jù)
db.userInfo.distinct(“name”);?
相當(dāng)于:select distict name from userInfo;
3. 查詢age = 22的記錄
db.userInfo.find({“age”: 22});?
相當(dāng)于: select * from userInfo where age = 22;
4. 查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});?
相當(dāng)于:select * from userInfo where age >22;
5. 查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});?
相當(dāng)于:select * from userInfo where age <22;
6. 查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});?
相當(dāng)于:select * from userInfo where age >= 25;
7. 查詢age <= 25的記錄
db.userInfo.find({age: {$lte: 25}});
8. 查詢age >= 23 并且 age <= 26
db.userInfo.find({age: {gte:23,gte:23,lte: 26}});?
查詢name中包含 mongo的數(shù)據(jù)
9. db.userInfo.find({name: /mongo/});
//相當(dāng)于%%?
select * from userInfo where name like ‘%mongo%’;
10. 查詢name中以mongo開(kāi)頭的
db.userInfo.find({name: /^mongo/});?
select * from userInfo where name like ‘mongo%’;
11. 查詢指定列name、age數(shù)據(jù)
db.userInfo.find({}, {name: 1, age: 1}); // 只訪問(wèn)name和age兩列的內(nèi)容,1位標(biāo)識(shí)?
相當(dāng)于:select name, age from userInfo;
12. 查詢指定列name、age數(shù)據(jù), age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});?
相當(dāng)于:select name, age from userInfo where age >25;
13. 按照年齡排序
升序:db.userInfo.find().sort({age: 1}); // 1 為標(biāo)識(shí),升序?
降序:db.userInfo.find().sort({age: -1}); // -1 為標(biāo)識(shí),降序
14.查詢name = zhangsan, age = 22的數(shù)據(jù)
db.userInfo.find({name: ‘zhangsan’, age: 22});?
相當(dāng)于:select * from userInfo where name = ‘zhangsan’ and age = ’22’;
15.查詢前5條數(shù)據(jù)
db.userInfo.find().limit(5);?
相當(dāng)于:select top 5 * from userInfo;
16. 查詢10條以后的數(shù)據(jù)
db.userInfo.find().skip(10);?
相當(dāng)于:select * from userInfo where id not in (?
select top 10 * from userInfo?
);
17. 查詢?cè)?-10之間的數(shù)據(jù)
db.userInfo.find().limit(10).skip(5);
18. or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});?
相當(dāng)于:select * from userInfo where age = 22 or age = 25;
19. 查詢第一條數(shù)據(jù)
db.userInfo.findOne();?
相當(dāng)于:selecttop 1 * from userInfo;?
db.userInfo.find().limit(1);
20. 查詢某個(gè)結(jié)果集的記錄條數(shù)
db.userInfo.find({age: {$gte: 25}}).count();?
相當(dāng)于:select count(*) from userInfo where age >= 20;
21. 按照某列進(jìn)行排序
db.userInfo.find({sex: {$exists: true}}).count();?
相當(dāng)于:select count(sex) from userInfo;
聚集集合查詢shell 操作
https://api.douban.com/v2/movie/top250獲取豆瓣電影數(shù)據(jù)?
將”subjects”:的數(shù)據(jù)插入到db.movie.insertMany()中,再寫(xiě)入到數(shù)據(jù)庫(kù)
#
db.movie.find({year:'1994'},{title:1, year:1}) { "_id" : ObjectId("591b296971d7222a7a0d7f67"), "title" : "肖申克的救贖", "year" : "1994" } { "_id" : ObjectId("591b296971d7222a7a0d7f68"), "title" : "這個(gè)殺手不太冷", "year" : "1994" } { "_id" : ObjectId("591b296971d7222a7a0d7f6a"), "title" : "阿甘正傳", "year" : "1994" }若不顯示_id字段內(nèi)容
> db.movie.find({year:'1994'},{title:1, year:1, _id:0}) { "title" : "肖申克的救贖", "year" : "1994" } { "title" : "這個(gè)殺手不太冷", "year" : "1994" } { "title" : "阿甘正傳", "year" : "1994" }顯式title,year和rating.averag
db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}) { "rating" : { "average" : 9.6 }, "title" : "肖申克的救贖", "year" : "1994" } { "rating" : { "average" : 9.4 }, "title" : "這個(gè)殺手不太冷", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "霸王別姬", "year" : "1993" } { "rating" : { "average" : 9.4 }, "title" : "阿甘正傳", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "美麗人生", "year" : "1997" } { "rating" : { "average" : 9.2 }, "title" : "千與千尋", "year" : "2001" } { "rating" : { "average" : 9.4 }, "title" : "辛德勒的名單", "year" : "1993" } { "rating" : { "average" : 9.2 }, "title" : "泰坦尼克號(hào)", "year" : "1997" } { "rating" : { "average" : 9.2 }, "title" : "盜夢(mèng)空間", "year" : "2010" } { "rating" : { "average" : 9.3 }, "title" : "機(jī)器人總動(dòng)員", "year" : "2008" } { "rating" : { "average" : 9.2 }, "title" : "海上鋼琴師", "year" : "1998" } { "rating" : { "average" : 9.1 }, "title" : "三傻大鬧寶萊塢", "year" : "2009" } { "rating" : { "average" : 9.2 }, "title" : "忠犬八公的故事", "year" : "2009" } { "rating" : { "average" : 9.2 }, "title" : "放牛班的春天", "year" : "2004" } { "rating" : { "average" : 9.2 }, "title" : "大話西游之大圣娶親", "year" : "1995" } { "rating" : { "average" : 9.2 }, "title" : "教父", "year" : "1972" } { "rating" : { "average" : 9.1 }, "title" : "龍貓", "year" : "1988" } { "rating" : { "average" : 9 }, "title" : "楚門(mén)的世界", "year" : "1998" } { "rating" : { "average" : 9.2 }, "title" : "亂世佳人", "year" : "1939" } { "rating" : { "average" : 9.1 }, "title" : "天堂電影院", "year" : "1988" }符合條件的條數(shù)
db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}).size() 20limit 顯式指定數(shù)目
> db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}).limit(5) { "rating" : { "average" : 9.6 }, "title" : "肖申克的救贖", "year" : "1994" } { "rating" : { "average" : 9.4 }, "title" : "這個(gè)殺手不太冷", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "霸王別姬", "year" : "1993" } { "rating" : { "average" : 9.4 }, "title" : "阿甘正傳", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "美麗人生", "year" : "1997" }skip 跳過(guò)制定數(shù)的數(shù)據(jù)
> db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}).skip(15) { "rating" : { "average" : 9.2 }, "title" : "教父", "year" : "1972" } { "rating" : { "average" : 9.1 }, "title" : "龍貓", "year" : "1988" } { "rating" : { "average" : 9 }, "title" : "楚門(mén)的世界", "year" : "1998" } { "rating" : { "average" : 9.2 }, "title" : "亂世佳人", "year" : "1939" } { "rating" : { "average" : 9.1 }, "title" : "天堂電影院", "year" : "1988" }limit和skip 3-5條數(shù)據(jù)
> db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}).skip(2).limit(3) { "rating" : { "average" : 9.5 }, "title" : "霸王別姬", "year" : "1993" } { "rating" : { "average" : 9.4 }, "title" : "阿甘正傳", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "美麗人生", "year" : "1997" }sort 排序 1 為升序,-1為降序
> db.movie.find({},{title:1, year:1, 'rating.average':1, _id:0}).sort({'rating.average':1})條件查詢
> db.movie.find({'rating.average':{$gt:9.4}},{title:1, 'rating.average':1, _id:0}) { "rating" : { "average" : 9.6 }, "title" : "肖申克的救贖" } { "rating" : { "average" : 9.5 }, "title" : "霸王別姬" } { "rating" : { "average" : 9.5 }, "title" : "美麗人生" }按指定內(nèi)容查詢
> db.movie.find({genres:{$in:['犯罪']}},{title:1, genres:1, _id:0}) { "genres" : [ "犯罪", "劇情" ], "title" : "肖申克的救贖" } { "genres" : [ "劇情", "動(dòng)作", "犯罪" ], "title" : "這個(gè)殺手不太冷" } { "genres" : [ "劇情", "犯罪" ], "title" : "教父" }node中使用MongoDB
var mongodb = require('mongodb')// 創(chuàng)建數(shù)據(jù)庫(kù)的連接var server = new mongodb.Server('localhost',27017,{auto_reconnect:true} )// 創(chuàng)建數(shù)據(jù)的連接 var db = new mongodb.Db('movies',server,{safe: true} )// 測(cè)試數(shù)據(jù)庫(kù)連接 db.open(function(err, db){if (err){console.log('log-'+ err)} else {console.log('log-connect mongodb success')db.collection('movie', {safe: true}, function(err, conn){if (err){console.log(err)} else {conn.find({}, {title:1, year:1, _id:0}).limit(3).skip(3).toArray(function(err, res){if(!err){res.forEach(function(value){console.log(value.title)})}})}})} }) //打印結(jié)果 //阿甘正傳 //美麗人生 //千與千尋?
總結(jié)
以上是生活随笔為你收集整理的nodejs操作mongodb增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最近微信方面的更新 getUserI
- 下一篇: 小米耳机设置(小米官方网站)