2012-11-18 15 views
19

mongooseを使用してデータを挿入する必要がありますが、コレクションの名前は挿入時にユーザーによって提供されるため、コレクションが存在するかどうかを最初に確認する必要があります。Node.js - Mongoose - コレクションが存在するかどうかをチェック

コレクションが存在するかどうかを確認する方法は、system.namespacesコレクションを照会することです。私はそれを行うための3つの可能なアプローチを見ることができます。

  1. (多分デシベルの1に一致するスキーマを定義)マングースを使用してsystem.namespacesを照会する方法を見つけます。
  2. 基本的なノード-mongodb-nativeオブジェクトをmongooseから取得し、手動でクエリを実行します。いずれにせよ、これは私がする方法を学びたいものです。
  3. クエリ

3を実行するノードMongoDBのネイティブ(またはいくつかの他のドライバ)の別個のインスタンスを使用すると、私にはない、少なくともエレガントなと私は避けるようにしようとしているものですmongooseがすでに作成したときに、ドライバの別のインスタンスをロードしたり、新しい接続を作成したりしたい。

私はこれを書いてから番号1を試してみるつもりです。私はちょうどsystem.namespacesをチェックし、スキーマはかなり単純に見える

私はまだいくつかの意見を聞きたいと思います。

ありがとうございます!

答えて

30

オプション2はおそらく最もクリーンです。 Mongoose Connectionというオブジェクトがで開かれたconnというオブジェクトを持っていると仮定すると、ネイティブmongo Dbオブジェクトにはconn.dbでアクセスできます。

conn.db.collectionNames(function (err, names) { 
    // names contains an array of objects that contain the collection names 
}); 

あなたはまた、あなたが探しているだけのものに結果をフィルタリングするcollectionNamesにパラメータとしてコレクション名を渡すことができます。そこから、あなたが探しているものを提供しなければならないcollectionNamesを呼び出すことができます。マングース4.xのは、使用してMongoDBのネイティブドライバのバージョン2.xでは

マングース4.xのアップデート

collectionNamesはフィルタを受け入れ、あなたが希望してカーソルを返すlistCollectionsに置き換えられましたこのように実行します。(コレクションのリストに

mongoose.connection.db.listCollections({name: 'mycollectionname'}) 
    .next(function(err, collinfo) { 
     if (collinfo) { 
      // The collection exists 
     } 
    }); 
-6

検索コレクションを

public function CollectionExists($collectionName) 
    { 
     $mongo = new Mongo(); 
     $collectionArr = $mongo->selectDB('yourrec')->listCollections(); 
     if (in_array($collectionName, $collectionArr)) { 
      return true; 
     } 
     return false; 
    } 
+1

はNode.jsのではなく、PHPです – Kino

関連する問題