mongoose 操作備忘

在使用node.js時浙值,時常與之搭配的是mongoDB,一般我們不寫原生mongo語法,一個經(jīng)常使用的mongo庫便是mongoose呀忧,由于個人記性比較差对碌,用過就忘了轧房,因此便記錄一下常用增刪改查api.

安裝mongoDB

安裝文檔: mongoDB安裝
我是mac平臺 用的是brew安裝
更新 brew (官網(wǎng)上是這么寫的 其實大可不必,直接跳過到第二步湿刽,會默認幫你更新)
brew update
brew install mongodb
其實到這里 就已經(jīng)安裝完了 并且可以啟動了

  • 輸入 表示啟動服務
    mongod --config /usr/local/etc/mongod.conf

  • 新起一個窗口啟動
    mongo

但是每次這樣啟動也很麻煩 我們配置一下

  • 創(chuàng)建數(shù)據(jù)目錄
    sudo mkdir -p /data/db

  • 進入安裝目錄 運行mongodb

cd /usr/local/Cellar/mongodb/<這里是你安裝時的版本號對應文件夾>/bin
mongod

  • 添加環(huán)境變量
    export PATH=<安裝路徑>/bin:$PATH
    把 <安裝路徑> 替換成你的的烁, 比如我的 /usr/local/Cellar/mongodb/<這里是你安裝時的版本號對應文件夾> , 其實和上面的路徑對應

  • 搞定
    輸入 mongod 另起窗口輸入 mongo

可視化工具

  • 官網(wǎng) robomongo
    我個人使用的是robomongo 當然還有特別多優(yōu)秀的客戶端诈闺,根據(jù)個人喜好選擇

快速開始

  • mongoose官網(wǎng)
    其實大部分都在官網(wǎng)寫的十分詳細渴庆,以備不時之需可以查閱

使用

const mongoose    = require('mongoose')
// 可用于監(jiān)測數(shù)據(jù)庫狀態(tài)
const db   = mongoose.connection
// 連接數(shù)據(jù)庫 test 表 如果不存在也沒關系 
mongoose.connect('mongodb://localhost/test', { useMongoClient: true });
// 用于解決警告
mongoose.Promise = global.Promise;

解釋:

  • { useMongoClient: true } 用于解決如下警告

(node:2772) DeprecationWarning: open() is deprecated in mongoose >= 4.11.0, use openUri() instead, or set the useMongoClient option if using connect() or createConnection(). See http://mongoosejs.com/docs/connections.html#use-mongo-client

創(chuàng)建 Schema

詳見 Schema

const Schema = mongoose.Schema;
// 定義表模型的數(shù)據(jù)類型
// required 必須的 接收一個 boolean 或者 function
const blogSchema = new Schema({
  title:  {type: String, required: true},
  author: String,
  age:  { type: Number, min: 18, max: 65 },
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },// default 默認當前時間戳
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});
  • 支持的類型
    • String
    • Number
    • Date
    • Buffer
    • Boolean
    • Mixed
    • ObjectId
    • Array

創(chuàng)建model

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

注: 文檔中在聲明方法的時候不要使用箭頭函數(shù)

創(chuàng)建文檔

通過上面的步驟其實已經(jīng)創(chuàng)建了表模型 創(chuàng)建一個文檔并保存到數(shù)據(jù)庫非常簡單

增刪改查

增加

方法一:

var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
small.save(function (err, doc) {
  if (err) return handleError(err);
  console.log(doc)
})

create: Model.create(doc(s), [callback])

Tank.create({ size: 'small' }, function (err, small) {
  if (err) return handleError(err);
  console.log(small._doc)
})

Model.insertMany(doc(s), [options], [options.ordered, [options.rawResult, [callback])

這一方法比循環(huán)create快 因為它只向服務器發(fā)送一個操作

var arr = [{ name: 'Star Wars' }, { name: 'The Empire Strikes Back' }];
Movies.insertMany(arr, function(error, docs) {});

刪除

Tank.remove({ size: 'large' }, function (err) {
  if (err) return handleError(err);
});

刪除 Tank 表中 sizelarge 的數(shù)據(jù)

改(更新)

update: Model.update(conditions, doc, [options], [callback])

參數(shù)

conditions <Object> 查詢條件 doc <Object> 要更新的文檔
[options] <Object> 選項 [callback] <Function> 回調(diào)函數(shù)

__注: 不能修改主鍵 _id __

  • options 有如下選項:
    • safe (boolean): 默認為true。安全模式雅镊。
    • upsert (boolean): 默認為false襟雷。如果不存在則創(chuàng)建新記錄。
    • multi (boolean): 默認為false仁烹。是否更新多個查詢記錄耸弄。
    • runValidators: 如果值為true,執(zhí)行Validation驗證卓缰。
    • setDefaultsOnInsert: 如果upsert選項為true计呈,在新建時插入文檔定義的默認值砰诵。
    • strict (boolean): 以strict模式進行更新。
    • overwrite (boolean): 默認為false捌显。禁用update-only模式茁彭,允許覆蓋記錄

示例

MyModel.update({ name: 'Tobi' }, { ferret: true }, { multi: true }, function (err, raw) {
  if (err) return handleError(err);
  console.log('The raw response from Mongo was ', raw);
});

更新多個 nameTobi 的文檔 將 ferret 設置為 true

Model.updateMany

更新多條數(shù)據(jù) 與update相同

Model.updateOne

更新一條數(shù)據(jù) 設置 multi 無效

查找

find: Model.find(conditions, [projection], [options], [callback])

conditions:查詢條件;projection:控制返回的字段苇瓣;options:控制選項尉间;callback:回調(diào)函數(shù)。

示例

// 命名 john  age 大于等于 18  只返回 title 與 author 字段 skip 跳過 10 條
MyModel.find({ name: 'john', age: { $gte: 18 }},{title: 1, author: 1},
{ skip: 10 },
function (err, docs) {});

// 返回一個query對象 類似于 promise exec 于 then
var query = MyModel.find({ name: /john/i }, null, { skip: 10 })
query.exec(function (err, docs) {});

findOne: Model.findOne([conditions], [projection], [options], [callback])

使用方法與 find 相同 只不過只返回第一個查詢記錄

findById: Model.findById(id, [projection], [options], [callback])

根據(jù) _id 字段查詢

相關查詢詳見 mongoDB

比較查詢操作符

  • $gt 大于(>)
  • $lt 小于(<)
  • $gte 大于等于(>=)
  • $lte 小于等于(<=)
  • $eq 等于(=)
  • $ne 不等于(!=)
  • $in 一個鍵對應多個值(在數(shù)組中)
Model.find( { qty: { $in: [ 5, 15 ] } } ) // 查詢 qty 等于 5 或者 15 的文檔
  • $nin 同上取反, 一個鍵不對應指定值

邏輯查詢操作符

  • $or 多個條件匹配, 可以嵌套 $in 使用
Model.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } ) 
// 查詢 quantity 小于 20  或者 price 等于 10 的文檔
  • $nor 同上取反

  • $not 不符合條件的文檔

Model.find( { price: { $not: { $gt: 1.99 } } } ) // price 不大于 1.99的
  • $and 與

其他常用運算符

limit 指定返回的最大條數(shù)

Query#limit(val)

query.limit(20)

skip 指定要跳過的條數(shù)
常用于分頁 公式 skip = (page<頁數(shù)> - 1) * pageSize<每頁條數(shù)>;

Query#skip(val)

query.skip(100).limit(20)

sort 排序 降序 -1 升序 1

Query#sort(arg)

query.sort({ test: -1 }); // 將 query 降序排列

原文鏈接: mongoose 操作備忘

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击罪,一起剝皮案震驚了整個濱河市哲嘲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媳禁,老刑警劉巖眠副,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竣稽,居然都是意外死亡囱怕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門毫别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃弓,“玉大人,你說我怎么就攤上這事岛宦√ù裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵砾肺,是天一觀的道長挽霉。 經(jīng)常有香客問我,道長变汪,這世上最難降的妖魔是什么侠坎? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮裙盾,結(jié)果婚禮上实胸,老公的妹妹穿的比我還像新娘。我一直安慰自己闷煤,他們只是感情好童芹,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲤拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪署咽。 梳的紋絲不亂的頭發(fā)上近顷,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天生音,我揣著相機與錄音,去河邊找鬼窒升。 笑死缀遍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的饱须。 我是一名探鬼主播域醇,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓉媳!你這毒婦竟也來了譬挚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酪呻,失蹤者是張志新(化名)和其女友劉穎减宣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玩荠,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡漆腌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阶冈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷尿。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖女坑,靈堂內(nèi)的尸體忽然破棺而出填具,到底是詐尸還是另有隱情,我是刑警寧澤堂飞,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布灌旧,位于F島的核電站,受9級特大地震影響绰筛,放射性物質(zhì)發(fā)生泄漏枢泰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一铝噩、第九天 我趴在偏房一處隱蔽的房頂上張望衡蚂。 院中可真熱鬧,春花似錦骏庸、人聲如沸毛甲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玻募。三九已至,卻和暖如春一姿,著一層夾襖步出監(jiān)牢的瞬間七咧,已是汗流浹背跃惫。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艾栋,地道東北人爆存。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蝗砾,于是被迫代替她去往敵國和親先较。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容