mongoose的基本使用

開始以前,沒什麼比過一遍官方文檔更有必要的了:http://mongoosejs.com/html

mongoose 是啥?有啥用?
mongoose 是操做 MongoDB 的一個對象模型庫;它封裝了MongoDB對文檔操做的經常使用處理方法(增刪改查),讓 NodeJS 操做 Mongodb 數據庫變得快捷靈活。vue

本文所用到的完整代碼:源碼node

安裝 mongoose

新建目錄 s4_mongoose 和 test.js 文件:git

mkdir s4_mongoose
cd s4_mongoose
touch test.js

初始化目錄生成 package.json 並安裝 mongoose:github

npm init
cnpm install mongoose --save

鏈接數據庫

編輯 test.js :mongodb

var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://127.0.0.1:27017/test');
db.connection.on('error', function(error){
  console.log('數據庫test鏈接失敗:' + error);
});
db.connection.on('open', function(){
  console.log('數據庫test鏈接成功');
});

接着先打開一個 iTerm2 終端,開啓 mongodb 服務:數據庫

mongod

再打開另外一個 iTerm2 終端,運行 test.js:npm

node test.js
//成功後便會輸出:數據庫test鏈接成功

Schema/Model/Entity

沒有比文檔更詳細的了:http://mongoosejs.com/docs/guide.htmljson

  1. Schema:數據庫集合的結構對象。數組

  2. Model :由Schema構造而成,可操做數據庫。

  3. Entity:由Model建立的實體,可操做數據庫。

看完文檔後,再看看下面一段代碼配合理解一下:

var mongoose = require("mongoose");
var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
// var testModel = db.model('test1', testSchema); // 集合名稱;集合的結構對象
var TestSchema = new mongoose.Schema({
    name : { type:String },
    age  : { type:Number, default:0 },
    email: { type:String },
    time : { type:Date, default:Date.now }
});
var TestModel = db.model("test1", TestSchema );
var TestEntity = new TestModel({
    name : "helloworld",
    age  : 28,
    email: "helloworld@qq.com"
});
TestEntity.save(function(error,doc){
  if(error){
     console.log("error :" + error);
  }else{
     console.log(doc);
  }
});

model 數據插入

在前面的數據庫鏈接成功的前提下,咱們在數據庫 test 下新建一個集合 test1 、並往裏面插入保存一組數據:

var testSchema = new mongoose.Schema({
  name: {type: String},
  age: {type: Number, default: 0},
  email: {type: String},
  time: {type: Date, default: Date.now}
});
var testModel = db.model('test1', testSchema); // 集合名稱;集合的結構對象
// Document文檔(關聯數組式的對象) < Collection集合 < 數據庫
// 插入保存一段數據
testModel.create([
  {name: "test1", age: 8},
  {name: "test2", age: 18},
  {name: "test3", age: 28},
  {name: "test4", age: 38},
  {name: "test5", age: 48},
  {name: "test6", age: 58, email:"tttt@qq.com"},
  {name: "test7", age: 68, email:"ssss@qq.com"},
  {name: "test8", age: 18},
  {name: "test9", age: 18, email:"rrrr@qq.com"},
  {name: "test10",age: 18}
], function (error, docs) {
  if(error) {
    console.log(error);
  } else {
    console.log('save ok');
    console.log(docs);
  }
});

find 數據查詢

mongoose 提供了find、findOne、和findById方法用於文檔查詢。
基本語法:

model.find(Conditions,fields,options,callback(err, doc));

Conditions: 查詢條件
fields: 返回的字段
options: 遊標(sort,limit)
callback: 回調函數,參數doc爲查詢出來的結果

條件查詢的基礎:
$lt (小於<)
$lte (小於等於<=)
$gt (大於>)
$gte (大於等於>=)
$ne (不等於,不包含!=)
$in (包含)
$or (查詢多個鍵值的任意給定值)
$exists (判斷某些屬性是否存在)
$all (所有)

具體的一些實例,代碼裏已有詳細註釋:

// find(Conditions,fields,callback);
// 省略或爲空、返回全部記錄;只包含name,age字段,去掉默認的_id字段;執行回調函數
testModel.find({}, {name:1, age:1, _id:0}, function(err, docs){
  if (err) {
    console.log('查詢出錯:' + err);
  } else {
    console.log('{}查詢結果爲:');
    console.log(docs);
  }
});
// 查詢age大於等於28,小於等於48
testModel.find({age: {$gte: 28, $lte: 48}}, {name:1, age:1, _id:0}, function(err, docs){
  if (err) {
    console.log('查詢出錯:' + err);
  } else {
    console.log('$gte,$lte查詢結果爲:');
    console.log(docs);
  }
});
// 查詢age爲5八、68的2條數據
testModel.find({age: {$in: [58, 68]}}, {name:1, age:1, _id:0}, function(err, docs){
  if (err) {
    console.log('查詢出錯:' + err);
  } else {
    console.log('$in查詢結果爲:');
    console.log(docs);
  }
});
// 查詢name爲test三、或者age爲18的所有數據
testModel.find({$or: [{name: 'test3'}, {age: 18}]}, {name:1, age:1, _id:0}, function(err, docs){
  if (err) {
    console.log('查詢出錯:' + err);
  } else {
    console.log('$or查詢結果爲:');
    console.log(docs);
  }
});

// step3:遊標查詢
// 查詢name爲test三、或者age爲18的所有數據;但限制只查詢2條數據
testModel.find({$or: [{name: 'test3'}, {age: 18}]}, {name:1, age:1, _id:0}, {limit: 2}, function(err, docs){
  if (err) {
    console.log('查詢出錯:' + err);
  } else {
    console.log('limit查詢結果爲:');
    console.log(docs);
  }
});

update 數據更新

基本使用:model.update(查詢條件,更新對象,callback);

var conditions = {name: 'test1'};
var update = {$set: {age: 11 }};
testModel.update(conditions, update, function(error){
  if(error) {
    console.log(error);
  } else {
    console.log('Update success!');
    testModel.find({name: 'test1'}, {name:1, age:1, _id:0}, function(err, docs){
      if (err) {
        console.log('查詢出錯:' + err);
      } else {
        console.log('更新test1後的查詢結果爲:');
        console.log(docs);  // 更新test_update後的查詢結果爲空數組:[ ];
                            // 更新test1後的查詢結果爲: [ { name: 'test1', age: 11 } ]
                            // 只能更新原本已存在的數據
      }
    });
  }
});

remove 數據刪除

基本使用:model.remove(查詢條件,callback);

var conditions = {name: 'test2'};
testModel.remove(conditions, function(error){
  if(error) {
    console.log(error);
  } else {
    console.log('Delete success!');
    testModel.find({name: 'test2'}, {name:1, age:1, _id:0}, function(err, docs){
      if (err) {
        console.log('查詢出錯:' + err);
      } else {
        console.log('刪除test2後的查詢結果爲:');
        console.log(docs);  // 刪除test2後的查詢結果爲空數組:[ ];
      }
    });
  }
});

robomongo mongodb可視化工具

安裝 mongodb 可視化工具 robomongo
在 iTerm2 開啓本地mongodb後(執行mongod),打開 robomongo,新建 connection 便可連上本地的 mongodb 數據庫。

相關文章
相關標籤/搜索