web-dev-qa-db-ja.com

Mongodbネイティブnodejsドライバーにコレクションが存在するかどうかを確認する方法は?

特定のデータベースにコレクションが存在するかどうかを確認し、存在しない場合は作成する必要があります。そんなこと知ってる

db.createCollection(collName, {strict:true}, function(error, collection))

コレクションを作成する前にcollNameコレクションの存在を確認し、errorオブジェクトを設定します。しかし、それを確認するには独立した関数が必要です。

36

MongoDB 3.0以降では、データベース内のすべてのコレクションをリストするコマンドを実行する必要があります:

use test;
db.runCommand( { listCollections: 1 } );

system.namespacesのクエリは、デフォルトのストレージエンジン(MMAPv1)を使用しても機能しますが、WiredTigerなどの他のエンジンで機能することは保証されていません。

MongoDB 3.0の前に、次のことを行う必要があります:

system.namespacesコレクションを照会できます。

use test;
db.system.namespace.find( { name: 'test.' + collName } );

のように:

db.system.namespaces.find( { name: 'test.testCollection' } );

返されるもの:

{ "name" : "test.testCollection", "options" : { "flags" : 1 } }

またはもちろん、何もありません。

参照: https://github.com/mongodb/specifications/blob/master/source/enumerate-collections.rst

14
Derick

ネイティブドライバーのcollectionNamesオブジェクトの Db メソッドは、コレクションの存在を確認できるようにするための最初のパラメーターとしてオプションのコレクション名フィルターを受け入れます。

db.collectionNames(collName, function(err, names) {
    console.log('Exists: ', names.length > 0);
});

MongoDBネイティブドライバーの2.xバージョンでは、collectionNameslistCollections に置き換えられました。これは、フィルターを受け入れてカーソルを返すため、次のようにします。

db.listCollections({name: collName})
    .next(function(err, collinfo) {
        if (collinfo) {
            // The collection exists
        }
    });
32
JohnnyHK

mongo-native driverと Node.js 7.6+を使用して、以下を使用します。

const collections = await db.collections();
if (!collections.map(c => c.s.name).includes(collName)) {
    await db.createCollection(collName);
}
8
ChrisV

Node.jsネイティブドライバーに listCollections メソッドが追加されました。現在のデータベース内のすべてのコレクションに関する情報を返します。これを使用して、特定のコレクションが存在するかどうかを確認できます。

collectionExists = function(name, cb) {
  mongoDb.listCollections().toArray(function(err, collections) {
    if (err) return cb(err);

    cb(null, collections.some(function(coll) {
      return coll.name == name;
    }));
  });
}
5
weekens

MongoDB 3.0以降では、単に次を実行できます。

db.getCollectionNames()

現在のデータベース上のすべてのコレクションの名前を含む配列を返します。

[ "employees", "products", "mylogs"]

Mongo DB Documentation を確認するか、各コレクションに関する詳細情報が必要な場合はdb.getCollectionInfos()を使用することもできます

4
Roberto

Mongodb 3.1.10。を使用する場合これは、コレクションが存在するかどうかを確認する方法です。

MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
  if (err) throw err;

  var dbo = client.db("dbname");
  dbo.listCollections().toArray(function(err, items){
    if (err) throw err;

    console.log(items); 
    if (items.length == 0)
        console.log("No collections in database")  
  }); 
});
1
roscoe_x

質問はネイティブドライバーに関するものですが、ここでpymongoでこれを行う方法を探しました。通常、pymongoのAPIはJS APIと同じですが、この場合はcollection_namesには、コレクション名の引数(JohnnyHKの-​​ answer のように)はありませんが、最初の引数はブール値です(システムコレクションを含めるかどうか)。文字列はTrueと評価されるため、混乱を招く可能性があります。したがって、これが将来の読者に役立つことを願っています。

import pymongo

cl = pymongo.MongoClient()
db = cl['my-db']
if 'my-col' in db.collection_names(False):
   ...
1
dimid