データベースを操作しないサービスはサービスではありません。 私の場合、 mongodbがDBMSとして選択されました。 私はmongodbの既存のORMソリューションを見て、特にクライアントでも使用されるため、使い慣れたツールを使用する方が便利だと思われたので、モデルにBackbone.Modelクラスを使用すると同時に、これらすべてをmongodbにカスタマイズする方法を確認することにしました。
だから挑戦。 mongodbベースを使用する特定のサービスがあります。 特定のコレクションから必要なオブジェクトを取得するには、新しいオブジェクトを作成してデータベースに保存できる必要があります。 オブジェクトを変更した後、データベースからオブジェクトを保存および削除できるはずです。
Backbone.jsは、モデルとコレクションという2つの基本オブジェクトを提供します。 今後のすべてのクラスを継承し続けるレイヤーを作成します。 データベースに接続してコレクションを受信するためのコードを残し、すべてが順調であると仮定することをすぐに予約します。 エラー処理も無視します。 ほとんどどこでも、Deferredを使用しています。 したがって、誰がどんな動物なのかわからない場合は、 ここで詳細を読むことができます。 mongodbへのリクエストは、 この node.jsモジュールを介して行われます-これは完全に重要ではありません。 コードは場所が単純化されているため、プロジェクトで使用する場合、完全に真実ではない可能性があります。
ベースモデル
どういうわけかデータベースから単一のモデルを取得する必要があります。このメソッドはクラスの静的な部分にうまく収まると思います。
var BaseModel = Backbone.Model.extend({ idAttribute: "_id", },{ db_collection: null, // fetchFromDb: function(filter, options){ var deferred = new Deferred(); if (typeof options === 'undefined') options = {}; db.getCollection(this.db_collection, function(err, collection){ collection.find(filter).toArray(function(err, items) { ret = new this(_.defaults(items[0], options)); } deferred.resolve(ret); }.bind(this)); ); return deferred.promise; } });
また、コードから、Backbone.Modelクラスのベースフィールドを再定義したことがわかります。このクラスは、オブジェクトのフィールドのリストでキーフィールドの名前を定義し、クラスの静的フィールドdb_collectionで、オブジェクトが属するコレクションを定義しました。
その後、たとえば、ユーザークラスを定義する場合:
var User = BaseModel.extend({},{ db_collection:"users"});
たとえば、次のように特定のユーザーを取得できます。
User.fetchFromDb({_id:1});
次に、作成したモデルを保存する方法を学習する必要があります。 これを行うために、backbone.jsは特別な同期メソッドを提供します。そのシグネチャは次のとおりです。
function sync(method, model, options)
ここで:
- method-状況に応じて、saveメソッドが返される場合があります。
- create-データベースに新しいモデルを作成します;
- 更新-既存のモデルのデータをデータベースに保存します。
- 読み取り-データベースから既存のモデルを更新します。
- 削除-データベースからオブジェクトを削除します。
- モデルは保存するオブジェクトです。
- options-保存時に追加のパラメーターで渡したもの。
sync: function(method, model, options){ var fltr = {}; var deferred = new Deferred(); db.getCollection(this.constructor.db_collection, collectionReady.bind(this)); return deferred.promise; function collectionReady(err, collection){ function done(err, result){ if (options.success) options.success(result); // backbone.js deferred.resolve({context: this, result: true}); } fltr[this.idAttribute] = this.get(this.idAttribute); switch (method){ case "update": collection.update( fltr, this.toJSON(), {multi:false, upsert: true}, done.bind(this) ); break; case "create": collection.insert( this.toJSON(), {safe:true}, done.bind(this) ); break; case "read": collection.find(fltr).toArray(function(err, items) { done.call(this, false, items[0]); } }.bind(this)); break; case "delete": collection.findAndModify(fltr, [], {}, {remove:true}, function(err, items) { deferred.resolve(); }); } } },
ここでも複雑なことはありません。 モデルを変更する特定の方法ごとに、データベース自体でこのアクションを実行できるハンドラーを切断します。
ここで、ユーザーオブジェクトを作成した後、たとえば次のようになります。
var user = new User({name:"Danil"});
安全に保存できます:
user.save()
また、保存後に削除します:
user.delete()
ベースコレクション
単一のモデルでの作業は十分に退屈なので、コレクションを実装します。特に、backbone.jsの基本クラスはこのためのものです。 モデルとの類推により、コレクションの基本クラスを再定義します。 今後のコレクションはすべて彼から継承されます。 まず、データベースから「生データ」のリストの抽出を記述します。
var BaseCollection = Backbone.Collection.extend({ },{ db_collection: null, __fetchCollection:function(filter, collection){ var deferred = new Deferred(); function collectionReady(err, collection){ collection.find(filter).toArray(function(err, items) { deferred.resolve(items); }.bind(this)); } db.getCollection(collection_db, collectionReady, this); return deferred.promise; } });
ここで、データベースから「生データ」のリストを取得できる静的クラスメソッドを作成し、継承者がオーバーライドする静的db_collectionフィールドを追加して、このクラスがmongodbのどのコレクションに属するかを示します。
必要なモデルの初期化を追加するために残り、ベースコレクションクラスに別の静的メソッドを追加します。
fetchFromDb:function(filter){ var deferred = new Deferred(); this.__fetchCollection(filter, this.db_collection).then( function(models){ deferred.resolve(new this(models)); }.bind(this) ); return deferred.promise; },
ここでは、「生データ」を取得し、このコレクションに関連付けられているモデル、データベースからのデータを初期化します。 もちろん、関連モデルからmongodbのコレクションの名前を取得できますが、これは単純化と見なします。
これで、ユーザーのコレクションを定義したら、データベースにクエリを実行して、ユーザーとオブジェクトを受け取ることができます。
var Users = BaseCollection.extend({model:User}, {db_collection: "users"}); Users.fetchFromDb({name:"Danil"}).then(function(users){ _.each(users,function(user){console.log(user.id)}); });
その結果、mongodbで作業するために必要なすべての最小値を取得し、backbone.jsが提供する他の機会を利用できるようになりました。