mongoose 操做備忘

在使用node.js時,時常與之搭配的是mongoDB,通常咱們不寫原生mongo語法,一個常常使用的mongo庫即是mongoose,因爲我的記性比較差,用過就忘了,所以便記錄一下經常使用增刪改查api.javascript

安裝mongoDB

安裝文檔: mongoDB安裝
我是mac平臺 用的是brew安裝
更新 brew (官網上是這麼寫的 其實大可沒必要,直接跳過到第二步,會默認幫你更新)html

brew update
brew install mongodbjava

其實到這裏 就已經安裝完了 而且能夠啓動了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, use openUri() instead, or set the useMongoClient option if using connect() or createConnection(). See http://mongoosejs.com/docs/co...

建立 Schema

詳見 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

建立model

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 表中 sizelarge 的數據

改(更新)

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);
});

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

Model.updateMany

更新多條數據 與update相同

Model.updateOne

更新一條數據 設置 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(val)

query.limit(20)

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

Query#skip(val)

query.skip(100).limit(20)

sort 排序 降序 -1 升序 1

Query#sort(arg)

query.sort({ test: -1 }); // 將 query 降序排列
相關文章
相關標籤/搜索