2016-05-26 10 views
0

DB接続が確立された後で再利用できるように、コレクションへの参照を保持することが悪い/良い考えであれば、私はアウトラインの文書を見つけることができませんでした。ネイティブMongoDBドライバNode.js - コレクションを格納する必要がありますか?

たとえば、私たちのデータベース.tsは、サーバーの起動時に呼び出されます。それは、コレクション全体を把握し、モジュール内で使用するために保管します。モジュール全体を参照することができます。コレクション

/*database.ts*/ 
 
//module to keep 1 connection alive and allow us to have 1 instance of our collections. 
 
import {MongoClient, Db, Collection } from 'mongodb'; 
 

 
let uri: string = 'connection_string'; 
 

 
export let db: Db; 
 

 
export let usrCollection: Collection; 
 

 
export let bookCollection: Collection; 
 

 
export function initDb(cb: any) { 
 
    MongoClient.connect(uri, function(err, database) { 
 
    //handle err   
 

 
    db = database; 
 
    cb(); //returns now since db is assigned. 
 
    }); 
 
} 
 

 
export function initCollections() { 
 
    usrCollection = db.collection('users'); //non-async 
 
    bookCollection = db.collection('book'); //non-async 
 
} 
 

 
    
 
/*app.ts*/ 
 
    
 
//in our express app when it start up 
 
import {db, initCollections, initDb} from './database'; 
 

 
initDb(function() { 
 
    //this will hold up our server from starting BUT 
 
    //there is no reason to make it async. 
 
    initCollections(); 
 
});

を格納/構築このパターンの短い来るのいくつかは何ですか?の

例改善することができますし、コレクションを管理することでパフォーマンスが低下するのを避けるべきですか?このパターンは、私のソースコードのバグを未然に防ぐか、バグを見つけ出して将来のために拡張しやすくしますか?またはより良いパターンがあります。 - mongooseのようなnode.jsソリューション用のネイティブmongodbドライバ以外のext​​ライブラリは必要ありません。

答えて

0

IMO、これは良い方法ではありません。 database.tsのユーザーは、これらのコレクションを使用する前にこれらのコレクションを初期化しておく必要があります。私は、データベースがどのように構造化されているかを決して気にするべきではないので、内部コレクションをエクスポートすることさえしません。 function addUser(user: User) {/.../}のようないくつかの演算関数をエクスポートする必要があります。 neat code sample created by MSがあります。

//編集。はい、コレクションのリファレンスを内部的に保存することができます。コレクションの名前を毎回入力する必要はありません。単数形と複数形を無視してバグを導入するのは簡単です。ベストプラクティスは、

import mongodb = require('mongodb'); 

const server = new mongodb.Server('localhost', 27017, {auto_reconnect: true}) 
const db = new mongodb.Db('mydb', server, { w: 1 }); 
db.open(function() {}); 
const userCollection =db.collection("users"); 
const bookCollection = db.collection("book"); 
+0

ですが、内部でコレクションを再利用するために保存しますか?または各関数で特定のコレクションのハンドラを取得する必要がありますか?共有した例を見ると、一度格納して使用するのではなく、常にdb.collectionメソッドが呼び出されます。私はちょうどコレクションを公開することも恐ろしいアイデアだと気づいたのですが、モジュールの内部ではコレクションへの参照を保持する必要がありますか? – Andrei

+1

はい、私はコレクションを保管します。その理由は、効率についてではなく、文字列( "users" <=> "user")の入力ミスによるバグを減らすためです。 @AndreiM。 – Zen

関連する問題