Node.js – Mongoose – 检查一个集合是否存在

我需要使用mongoose插入一些数据,但集合的名称是由用户在插入时提供的,所以我首先必须检查集合是否存在。

我知道如何检查一个集合是否存在的方式是通过查询system.namespaces集合。 我可以看到3种可能的方法来做到这一点。

  1. find一种方法来使用mongoose查询system.namespaces (也许定义一个模式匹配的数据库)。
  2. 从mongoose中获取一些底层的node-mongodb-native对象并手动执行查询。 无论如何,这是我想学习如何做的事情。
  3. 使用一个独立的node-mongodb-native(或其他驱动程序)实例来执行查询

数字3是最不优雅,我试图避免的,我不想加载驱动程序的另一个实例,也没有创build一个新的连接时,mongoose已经创build一个。

写这个之后我要试试1号。 我刚刚检查了system.namespaces ,模式看起来很简单

我还想听听一些意见。

谢谢!

选项2可能是最干净的。 假设你有一个名为conn的Mongoose Connection对象,它是用conn.db打开的,你可以通过conn.db访问本地的mongo Db对象。 从那里你可以打电话collectionNames应该提供你在找什么:

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

您还可以将集合名称作为parameter passing给collectionNames以便将结果过滤为您正在查找的内容。

mongoose4.x更新

在Mongoose 4.x使用的MongoDB本地驱动程序的2.x版本中, collectionNames已被listCollections取代,它接受一个filter并返回一个游标,所以你可以这样做:

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

在collections列表中findcollections

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