在使用node.js時,時常與之搭配的是mongoDB,通常咱們不寫原生mongo語法,一個常常使用的mongo庫即是mongoose,因爲我的記性比較差,用過就忘了,所以便記錄一下經常使用增刪改查api.javascript
安裝文檔: mongoDB安裝
我是mac平臺 用的是brew安裝
更新 brew (官網上是這麼寫的 其實大可沒必要,直接跳過到第二步,會默認幫你更新)html
brew update
brew install mongodb
java
其實到這裏 就已經安裝完了 而且能夠啓動了node
輸入 表示啓動服務mongodb
mongod --config /usr/local/etc/mongod.conf
數據庫
新起一個窗口啓動api
mongo
數組
可是每次這樣啓動也很麻煩 咱們配置一下promise
建立數據目錄安全
sudo mkdir -p /data/db
進入安裝目錄
cd /usr/local/Cellar/mongodb/<這裏是你安裝時的版本號對應文件夾>/bin
運行mongodb
mongod
添加環境變量
export PATH=<安裝路徑>/bin:$PATH
把 <安裝路徑> 替換成你的, 好比個人 /usr/local/Cellar/mongodb/<這裏是你安裝時的版本號對應文件夾> , 其實和上面的路徑對應
搞定
輸入 mongod
另起窗口輸入 mongo
官網 robomongo
我我的使用的是robomongo 固然還有特別多優秀的客戶端,根據我的喜愛選擇
其實大部分都在官網寫的十分詳細,以備不時之需能夠查閱
const mongoose = require('mongoose') // 可用於監測數據庫狀態 const db = mongoose.connection // 鏈接數據庫 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/co...
詳見 Schema
const Schema = mongoose.Schema; // 定義表模型的數據類型 // 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
var Blog = mongoose.model('Blog', blogSchema);
注: 文檔中在聲明方法的時候不要使用箭頭函數
經過上面的步驟其實已經建立了表模型 建立一個文檔並保存到數據庫很是簡單
方法一:
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])
這一方法比循環create
快 由於它只向服務器發送一個操做
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
的數據
update: Model.update(conditions, doc, [options], [callback])
參數
conditions
<Object> 查詢條件 doc
<Object> 要更新的文檔[options]
<Object> 選項 [callback]
<Function> 回調函數
注: 不能修改主鍵 _id
options 有以下選項:
safe (boolean): 默認爲true。安全模式。
upsert (boolean): 默認爲false。若是不存在則建立新記錄。
multi (boolean): 默認爲false。是否更新多個查詢記錄。
runValidators: 若是值爲true,執行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
更新多條數據 與update相同
更新一條數據 設置 multi 無效
find: Model.find(conditions, [projection], [options], [callback])
conditions
:查詢條件;projection
:控制返回的字段;options
:控制選項;callback
:回調函數。
示例
// 命名 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])
根據 _id 字段查詢
相關查詢詳見 mongoDB
$gt 大於(>)
$lt 小於(<)
$gte 大於等於(>=)
$lte 小於等於(<=)
$eq 等於(=)
$ne 不等於(!=)
$in 一個鍵對應多個值(在數組中)
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 指定返回的最大條數
query.limit(20)
skip 指定要跳過的條數
經常使用於分頁 公式 skip = (page<頁數> - 1) * pageSize<每頁條數>;
query.skip(100).limit(20)
sort 排序 降序 -1 升序 1
query.sort({ test: -1 }); // 將 query 降序排列