我需要检查某个数据库中是否存在集合,如果不存在则创建它。我知道
db.createCollection(collName, {strict:true}, function(error, collection))
在创建集合collName
之前检查它是否存在并设置error
对象。但是我需要一个独立的功能来检查它。
答案 0 :(得分:29)
本机驱动程序的Db
对象的collectionNames
方法接受可选的集合名称过滤器作为第一个参数,以便检查集合是否存在:
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
}
});
答案 1 :(得分:12)
在MongoDB 3.0及更高版本中,您必须运行命令以列出数据库中的所有集合:
use test;
db.runCommand( { listCollections: 1 } );
虽然使用默认存储引擎(MMAPv1)时查询system.namespaces
仍然有效,但不保证可以用于其他引擎,例如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
答案 2 :(得分:8)
使用mongo-native驱动程序和Node.js 7.6+,我使用以下内容:
const collections = await db.collections();
if (!collections.map(c => c.s.name).includes(collName)) {
await db.createCollection(collName);
}
答案 3 :(得分:6)
从MongoDB 3.0开始,您只需运行:
db.getCollectionNames()
返回一个数组,其中包含当前数据库中所有集合的名称:
[ "employees", "products", "mylogs"]
检查Mongo DB Documentation,或者如果您需要有关每个集合的更多信息,也可以使用db.getCollectionInfos()
答案 4 :(得分:5)
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 :(得分:1)
问题涉及本机驱动程序,但我在这里搜索如何在pymongo
中执行此操作。通常pymongo
的api与JS api相同,但在这种情况下collection_names
没有集合名称的参数(如JohnnyHK
的{{3}} ),而是第一个参数是布尔值(是否包括系统集合)。由于字符串的计算结果为True
,因此可能会造成混淆。所以我希望这有助于未来的读者:
import pymongo
cl = pymongo.MongoClient()
db = cl['my-db']
if 'my-col' in db.collection_names(False):
...
答案 6 :(得分:1)
如果您使用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")
});
});
答案 7 :(得分:0)
适用于3.6。*版本的最新答案。
/**
* Checks if a collection exists in a mongo database.
*
* @param db a mongo db object. eg.
* client = await MongoClient.connect(uri);
* db = client.db();
* @param collectionName the name of the collection to search for
* @returns {Promise<boolean>}
*/
async function doesCollectionExistInDb(db, collectionName) {
const collections = await db.collections();
return collections.some(
(collection) => collection.collectionName === collectionName
);
}
...
if (await doesCollectionExistInDb(db, 'products')) {
// Do something, such as create a new collection
}
collection.collectionName
是记录的收集api的一部分,可以在这里找到:http://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#collectionName
答案 8 :(得分:0)
对于具有mongodb库(v 3.6.3)的nodejs,这是我使其工作的唯一方法:
const collectionName = 'products'
const exists = (await (await db.listCollections().toArray()).findIndex((item) => item.name === collectionName) !== -1)
console.log(exists)
希望对别人有帮助
答案 9 :(得分:0)
/* set database */
let db = client.db( 'crud' )
/* set collection */
let collection = db.collection( 'categories' )
/* set query */
collection.find( {} ).toArray( ( err, result ) => {
if ( result.length > 0 )
{
console.log("Exist");
}
else
{
console.log("Not Exist");
// create collection
}
}
答案 10 :(得分:0)
实际上,这对我有用
await db.createCollection(name, function (err, res) {
if (err) {
//console.log(err);
if (err.codeName =="NamespaceExists") {
console.log("Already Exists Collection : " + name + "");
return;
}
}
console.log("Collection created! : "+name+"");
});