特定のデータベースにコレクションが存在するかどうかを確認し、存在しない場合は作成する必要があります。そんなこと知ってる
db.createCollection(collName, {strict:true}, function(error, collection))
コレクションを作成する前にcollName
コレクションの存在を確認し、error
オブジェクトを設定します。しかし、それを確認するには独立した関数が必要です。
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
ネイティブドライバーのcollectionNames
オブジェクトの Db
メソッドは、コレクションの存在を確認できるようにするための最初のパラメーターとしてオプションのコレクション名フィルターを受け入れます。
db.collectionNames(collName, function(err, names) {
console.log('Exists: ', names.length > 0);
});
MongoDBネイティブドライバーの2.xバージョンでは、collectionNames
が listCollections
に置き換えられました。これは、フィルターを受け入れてカーソルを返すため、次のようにします。
db.listCollections({name: collName})
.next(function(err, collinfo) {
if (collinfo) {
// The collection exists
}
});
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);
}
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;
}));
});
}
MongoDB 3.0以降では、単に次を実行できます。
db.getCollectionNames()
現在のデータベース上のすべてのコレクションの名前を含む配列を返します。
[ "employees", "products", "mylogs"]
Mongo DB Documentation を確認するか、各コレクションに関する詳細情報が必要な場合はdb.getCollectionInfos()を使用することもできます
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")
});
});
質問はネイティブドライバーに関するものですが、ここで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):
...