在使用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, useopenUri()
instead, or set theuseMongoClient
option if usingconnect()
orcreateConnection()
. 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 表中 size
為 large
的數(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);
});
更新多個 name
為 Tobi
的文檔 將 ferret 設置為 true
更新多條數(shù)據(jù) 與update相同
更新一條數(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(20)
skip 指定要跳過的條數(shù)
常用于分頁 公式 skip = (page<頁數(shù)> - 1) * pageSize<每頁條數(shù)>;
query.skip(100).limit(20)
sort 排序 降序 -1 升序 1
query.sort({ test: -1 }); // 將 query 降序排列
原文鏈接: mongoose 操作備忘