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