nodejs操作mongodb增删改查
1. Mac系統(tǒng)上安裝
使用Homebrew安裝
$ brew updata // 更新Homebrew的package數(shù)據(jù)庫 $ brew install mongodb2. 啟動MongoDB
$mongod --config /usr/local/etc/mongod.conf // sudo mongod3. 使用MongoDB shell
$ mongoMongoDB是什么?
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。?
特點是:?
高性能、易部署、易使用、存儲數(shù)據(jù)方便
MongoDB概念
| 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è)置為主鍵 |
1. 數(shù)據(jù)庫
- 一個mongodb中可以建立多個數(shù)據(jù)庫
- MongoDB的默認數(shù)據(jù)庫為“db”,該數(shù)據(jù)庫存儲在data目錄中。
- MongoDB的單個實例可以容納多個獨立的數(shù)據(jù)庫,每一個都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫也放置在不同的文件中
數(shù)據(jù)庫的命名:通過標識符,使用utf8字符串
- 非空
- 不允許出現(xiàn)特殊字符$,/
- 全部小寫,最多64個字節(jié)
- 有一些特殊保留數(shù)據(jù)庫,如local、admin、config,命名時避免使用
2. 文檔
文檔是一個鍵值(key-value)對(即BSON)。MongoDB的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,也是MongoDB非常突出的特點。
3. 集合
集合就是 MongoDB文檔組,類似于RDBMS(關(guān)系型數(shù)據(jù)庫管理系統(tǒng))中的表格。?
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu),這意味著對集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入的數(shù)據(jù)都會有一定的關(guān)聯(lián)性。
結(jié)合的命名
- 不能是空字符串
- 不允許出現(xiàn)- 0
- 不能以system.開頭,這是系統(tǒng)保留的前綴
- 不能包含保留字,$
4.MongoDB數(shù)據(jù)類型
| null | 用于表示空值或者不存在的字段{“x”,null} |
| 布爾 | ‘true’和’false’{“x”,true} |
| 32位整數(shù) | Shell中這個類型不可用,MongoDB在控制臺使用JS引擎進行輸入,而JS僅支持64位浮點數(shù),所以32位整數(shù)將會被自動轉(zhuǎn)義 |
| 64位整數(shù) | Shell中這個類型不可用, 64位整數(shù)與32位整數(shù)一樣,在MongoDB控制臺使用時,會轉(zhuǎn)義成64位浮點數(shù) |
| 64位浮點數(shù) | Shell中的數(shù)字都是這種類型,下面是浮點數(shù){“x”:3.14}、{“x”:3} |
| 字符串 | UTF-8字符串都可表示為字符串類型的數(shù)據(jù){“x”:”foobar”} |
| 符號 | Shell不支持這種類型,將自動轉(zhuǎn)義成字符串 |
| 對象ID | 對象id是文檔的12字節(jié)的唯一ID,時間戳 |
| 日期 | 日期類型存儲的是從標準紀元開始的毫秒數(shù){“x”:new Date()} |
| 正則表達式 | 文檔中可以包含正則表達式,其正則表達式采用JS語法來表示{“x”:/foobar/i} |
| 代碼 | 文檔中可以包含js代碼{“x”:function(){…}} |
| 二進制數(shù)據(jù) | 二進制數(shù)據(jù)可以由任意字節(jié)的串組成,不過Shell無法使用 |
| 最大值 | BSON包括一個特殊類型,表示可能的最大值Shell無法使用 |
| 最小值 | BSON包括一個特殊類型,表示可能的最小值Shell無法使用 |
| 未定義 | 文檔中也可以使用未定義類型{“x”:undefined} |
| 數(shù)組 | 值的集合或者列表可以表示成數(shù)組{“x”:[“a”,”b”,”c”]} |
| 內(nèi)嵌文檔 | 文檔可以包含別的文檔{“x”:{“foo”:”bar”}} |
MongoDB操作
1. 數(shù)據(jù)庫常用命名
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ù)庫
> use music switched to db music > show dbs // 當前列表里沒有music數(shù)據(jù)庫,因為沒有數(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ù)庫 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ù)庫 { "dropped" : "music", "ok" : 1 }Collection 聚集集合操作
1. 創(chuàng)建一個聚集集合
db.createCollection(“collName”, {size: 20, capped: true, max: 100});?
db.collName.isCapped(); //判斷集合是否為定容量
capped:true 將集合固定大小,可以提高訪問數(shù)據(jù)庫的效率,插入數(shù)據(jù)時,會自動進行順序管理
> db.albums.isCapped() //判斷集合是否為定容量 truesize的優(yōu)先級大于max
2. 得到指定名稱的聚集集合
> db.getCollection('albums') music.albums3. 得到當前db的所有聚集集合
> db.getCollectionNames() [ "albums" ]4. 顯示當前db所有聚集的狀態(tài)
db.printCollectionStats()添加、修改與刪除集合數(shù)據(jù)
1. 添加
> db.albums.insertOne({title:'生命之花'}) > db.albums.insertMany([{title:'再見理想'},{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" : "再見理想", "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 | 查詢過濾條件 | {} |
| sort | 如果多個文檔符合查詢過濾條件,將以該參數(shù)指定的排列方式選擇出排在首位的對象,該對象將被操作 | {} |
| remove | 若為true,被選中對象將在返回前被刪除 | N/A |
| update | 一個 修改器對象 | N/A |
| new | 若為true,將返回修改后的對象而不是原始對象。在刪除操作中,該參數(shù)被忽略。 | FALSE |
| upsert | 創(chuàng)建新對象若查詢結(jié)果為空 | FALSE |
聚集集合查詢
1. 查詢所有記錄
db.userInfo.find();?
相當于:select* from userInfo;
2.查詢?nèi)ブ睾髷?shù)據(jù)
db.userInfo.distinct(“name”);?
相當于:select distict name from userInfo;
3. 查詢age = 22的記錄
db.userInfo.find({“age”: 22});?
相當于: select * from userInfo where age = 22;
4. 查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});?
相當于:select * from userInfo where age >22;
5. 查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});?
相當于:select * from userInfo where age <22;
6. 查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});?
相當于: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/});
//相當于%%?
select * from userInfo where name like ‘%mongo%’;
10. 查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});?
select * from userInfo where name like ‘mongo%’;
11. 查詢指定列name、age數(shù)據(jù)
db.userInfo.find({}, {name: 1, age: 1}); // 只訪問name和age兩列的內(nèi)容,1位標識?
相當于:select name, age from userInfo;
12. 查詢指定列name、age數(shù)據(jù), age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});?
相當于:select name, age from userInfo where age >25;
13. 按照年齡排序
升序:db.userInfo.find().sort({age: 1}); // 1 為標識,升序?
降序:db.userInfo.find().sort({age: -1}); // -1 為標識,降序
14.查詢name = zhangsan, age = 22的數(shù)據(jù)
db.userInfo.find({name: ‘zhangsan’, age: 22});?
相當于:select * from userInfo where name = ‘zhangsan’ and age = ’22’;
15.查詢前5條數(shù)據(jù)
db.userInfo.find().limit(5);?
相當于:select top 5 * from userInfo;
16. 查詢10條以后的數(shù)據(jù)
db.userInfo.find().skip(10);?
相當于:select * from userInfo where id not in (?
select top 10 * from userInfo?
);
17. 查詢在5-10之間的數(shù)據(jù)
db.userInfo.find().limit(10).skip(5);
18. or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});?
相當于:select * from userInfo where age = 22 or age = 25;
19. 查詢第一條數(shù)據(jù)
db.userInfo.findOne();?
相當于:selecttop 1 * from userInfo;?
db.userInfo.find().limit(1);
20. 查詢某個結(jié)果集的記錄條數(shù)
db.userInfo.find({age: {$gte: 25}}).count();?
相當于:select count(*) from userInfo where age >= 20;
21. 按照某列進行排序
db.userInfo.find({sex: {$exists: true}}).count();?
相當于:select count(sex) from userInfo;
聚集集合查詢shell 操作
https://api.douban.com/v2/movie/top250獲取豆瓣電影數(shù)據(jù)?
將”subjects”:的數(shù)據(jù)插入到db.movie.insertMany()中,再寫入到數(shù)據(jù)庫
#
db.movie.find({year:'1994'},{title:1, year:1}) { "_id" : ObjectId("591b296971d7222a7a0d7f67"), "title" : "肖申克的救贖", "year" : "1994" } { "_id" : ObjectId("591b296971d7222a7a0d7f68"), "title" : "這個殺手不太冷", "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" : "這個殺手不太冷", "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" : "這個殺手不太冷", "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" : "泰坦尼克號", "year" : "1997" } { "rating" : { "average" : 9.2 }, "title" : "盜夢空間", "year" : "2010" } { "rating" : { "average" : 9.3 }, "title" : "機器人總動員", "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" : "楚門的世界", "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" : "這個殺手不太冷", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "霸王別姬", "year" : "1993" } { "rating" : { "average" : 9.4 }, "title" : "阿甘正傳", "year" : "1994" } { "rating" : { "average" : 9.5 }, "title" : "美麗人生", "year" : "1997" }skip 跳過制定數(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" : "楚門的世界", "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" : [ "劇情", "動作", "犯罪" ], "title" : "這個殺手不太冷" } { "genres" : [ "劇情", "犯罪" ], "title" : "教父" }node中使用MongoDB
var mongodb = require('mongodb')// 創(chuàng)建數(shù)據(jù)庫的連接var server = new mongodb.Server('localhost',27017,{auto_reconnect:true} )// 創(chuàng)建數(shù)據(jù)的連接 var db = new mongodb.Db('movies',server,{safe: true} )// 測試數(shù)據(jù)庫連接 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增删改查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近微信方面的更新 getUserI
- 下一篇: js中时间戳与日期格式的相互转换