nodejsは、monogoogleモジュールを使ってmonogodbデータベースを操作します.

8361 ワード

npmにmongoogleをインストールします.
npm install mongoose
monode-mongooseはMongoDBの対象モデルツールであり、node-mongodb-nativeに基づいて開発されたMongoDB nodejsドライバであり、非同期の環境で実行できます.また、MongoDB操作に対する対象のモデルライブラリでもあり、MongoDBのドキュメントに対する添削や修正などの常用方法を実装しており、NodeJSがMongodbデータベースを操作することをより柔軟に簡単にしています.Schema:ファイル形式で格納されたデータベースモデルの骨格で、データベースの操作能力Modelを備えていません.Schemaによって生成されたモデルを発表し、抽象的な属性と行為を持つデータベース操作はEnttityに対して、Modelによって作成されたエンティティに対しても、彼の操作はデータベースの間の関係に影響を及ぼします.ModelとEntityはいずれもデータベース操作に影響を与えることができますが、ModelはEntityより操作性が高いです.Model対応collection、Entity対応docment.
1.増加
Entityであれば、save方法を使い、Modelであれば、create方法を使います.
// mongoose   
var mongoose = require('mongoose');
var db       = mongoose.connect('mongodb://127.0.0.1:27017/chm'); 
//     
db.connection.on('error', function(error) {
    console.log(error);
});

db.connection.on("open", function () { 
console.log("——       !——"); 
});

// Schema   
var vipSchema = new mongoose.Schema({
    name : {type : String, default : 'java'},
    addr    : {type : String},
    addTime  : {type : Date, default: Date.now},
    age      : {type : Number}
});
//   
//save    
vipSchema.pre('save', function(next){
    console.log("pre save");
    next();
});
vipSchema.post('save', function (doc) {
    //doc        
    console.log(doc);
});

// model
var vipModel = db.model('vip', vipSchema);
//         entity   
var doc = {name : 'java', age:20, addr:"shanghai"};
var vipEntity= new vipModel(doc);

vipEntity.save(function(error) {
    if(error) {
        console.log(error);
    } else {
        console.log('saved OK!');
    }
    //        
    db.disconnect();
});
//       model  
vipModel.create(doc, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('save ok');
    }
    //        
    db.disconnect();
});
ここで問題があります.上のコードを実行したら、データベースにdb.vip.find()を実行します.追加されたばかりのデータが見つからないことを発見して、ショーのコレクションを実行すると、もう一つのvipsセットが見つかります.データはこのセットの中にあります.ここではモデル名からデータベース名までの命名変換について記事を書いています.以下に紹介します.
2.検索
var mongoose = require("mongoose");
var db = mongoose.connect('mongodb://localhost:27017/chm'); 

db.connection.on("error", function (error) { 
console.log("       :" + error); 
}); 
db.connection.on("open", function () { 
console.log("——       !——"); 
});

var Schema = mongoose.Schema;
//  
var vipSchema = new Schema({
    name:String,
    age:Number,
    addr:String,
    addTime:Date
});

//    mongoose     
vipSchema.methods.findByName = function(hello, callback) {
    return this.model('vips').find({name: hello}, callback);
}
//    mongoose     ,     Model     
vipSchema.statics.findbyage = function(age, callback) {
    return this.model('vips').find({age: age}, callback);
}

//  
var vipModel = mongoose.model('vips', vipSchema);


vipModel.find({name:"java"},function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //       
    db.disconnect();
 });
//         
var entity = new vipModel({"name":"java"});
entity.findByName("java",function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //       
    db.disconnect();
});

//         
vipModel.findbyage(20, function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //       
    db.disconnect();;
});
もう一つのクエリー:クエリーにはコールバックがありません.
vipModel
      .find({ occupation: /host/ })
      .where('name.last').equals('Ghost')
      .where('age').gt(17).lt(66)
      .where('likes').in(['vaporizing', 'talking'])
      .limit(10)
      .sort('-occupation')
      .select('name occupation')
      .exec(callback);
calbackを持っていないなら、queryに戻ります.queryは実行されていないプリコンパイルクエリ文で、このqueryオブジェクトが実行する方法はすべて自分に戻ります.execメソッドを実行する時のみクエリーを実行します.また、フィードバックが必要です.
もう一つはIdで調べます.
var ObjectId = require('mongodb').ObjectID;
let _id = ObjectId(_id);
this.collection.findOne({_id:_id}, {}, function(err, doc) {
    console.log(err, doc);
});
3.変更
//        
......

//     
var conditions = {name : 'java'};
var update     = {$set : {age : 27}};
var options    = {upsert : true};
vipModel.update(conditions, update, options, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('update ok!');
    }
    //       
    db.disconnect();
});
4.削除
削除には2つの方法があります.EntityとModelは全部remove方法を使います.
//        
......

var conditions = {username: 'java'};
vipModel.remove(conditions, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('delete ok!');
    }

    //       
    db.disconnect();
});
Sub Docs
SQLデータベースの2つの表に主外関係があるように、2つのDocmentの入れ子をSub-Docsといいます.
簡単に言えば、Dockmentネスティングのもう一つのDockmentまたはDcumentです.
var ChildSchema1 = new Schema({name:String});
var ChildSchema2 = new Schema({name:String});
var ParentSchema = new Schema({
   children1:ChildSchema1,   //  Document
   children2:[ChildSchema2]  //  Documents
});
Sub-DocsはDocmentsと同じ操作を楽しむが、Sub-Docsの操作はすべて父の種類で行われる.
var ParentModel = db.model('Parent',parentSchema);
 var parent = new ParentModel({
      children2:[{name:'c1'},{name:'c2'}]
    });
 parent.children2[0].name = 'd';
 parent.save(callback);
parentは保存を実行する時、children 2を含むので、彼はデータベースモデルのオブジェクトです.だから、先にchilren 2[0]とchilren 2[1]を保存します.
サブドキュメントが更新中にエラーが発生した場合、直接親文書に報告します.
ChildrenSchema.pre('save',function(next){
        if('x' === this.name) 
            return next(new Error('#err:not-x'));
            next();
        });
        var parent = new ParentModel({children1:{name:'not-x'}});
        parent.save(function(err){
        console.log(err.message); //#err:not-x
    });
4.1サブ文書を照会する
childrenがparentのサブ文書であれば、以下の方法でchildrenを調べられます.
var child = parent.children.id(id);
4.2新規、削除、更新
サブドキュメントは親文書の属性ですので、属性によって操作すればいいです.親クラスが追加された場合、サブドキュメントは先に追加されます.
もしChildrenSchemaが一時的なサブドキュメントであれば、データベースマッピングセットとして使用しないでください.
var ParentSchema = new Schema({
   children:{
      name:String
   }
});
//          
データ検証
データの保存には検証が必要です.何のデータもデータベースに落としたり、クライアントに表示したりするのではなく、データの検証には以下のルールを覚えておく必要があります.
検証は常にSchemaTypeで定義されています.検証は内部ミドルウェアであり、Dcumentが保存されている間にデフォルトで有効にされています.認証をオフにしない限り、SubDocの検証が失敗したら、Dcumentも検証を保存できなくなります.Validation Errorを通じて、7.1ベリファイアrequired非空検証min/max範囲検証(辺値検証)enum/mach列挙検証/マッチング検証validateカスタム検証ルールにアクセスできます.
以下は総合事例です.
    var PersonSchema = new Schema({
      name:{
        type:'String',
        required:true //    
      },
      age:{
        type:'Nunmer',
        min:18,       //    18
        max:120     //    120
      },
      city:{
        type:'String',
        enum:['  ','  ']  //     、   
      },
      other:{
        type:'String',
        validate:[validator,err]  //validator       ,err          
      }
    });
7.2認証に失敗しました
検証に失敗したら、err情報を返します.errはオブジェクトの属性です.
err.errors                //    (  )
err.errors.color          //    (Schema color  )
err.errors.color.message  //      
err.errors.path             //      
err.errors.type             //    
err.name                //    
err.message                 //    
検証に失敗すると、ModelとEntityは、errと同じerrors属性を持つことになります.
ModelからCollectionまでのネーミングポリシー
monogoogle/lib/util.jsモジュールでは、以下のコードセグメントが集合命名の元となります.
function pluralize (str) {
  var rule, found;
  if (!~uncountables.indexOf(str.toLowerCase())){
    found = rules.filter(function(rule){
      return str.match(rule[0]);
    });
    if (found[0]) return str.replace(found[0][0], found[0][1]);
  }
  return str;
};
1.モデル名が数えられないかどうかを判断し、直接モデル名に戻る場合.複数変換された正規表現がマッチします.
2.複素変換正則整合結果を返します.
3.複数変換正則が存在しない場合、直接モデル名を返します.そうでなければマッチング結果の最初のものを取り、モデル名を処理します.(説明が必要なのは、rulesは特殊から一般の順に並べられている)