【问题标题】:Node.js - Mongoose - Check if a collection existsNode.js - Mongoose - 检查集合是否存在
【发布时间】:2012-11-06 20:21:15
【问题描述】:

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

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

  1. 找到一种使用 mongoose 查询 system.namespaces 的方法(可能定义与 db 中的架构匹配的架构)。
  2. 从 mongoose 获取一些底层 node-mongodb-native 对象并手动执行查询。无论如何,这是我想学习如何去做的事情。
  3. 使用 node-mongodb-native(或其他一些驱动程序)的单独实例来执行查询

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

写完后我要试试号码1。我刚刚检查了system.namespaces,架构看起来很简单

我还是想听听一些意见。

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这是另一个对我有用的选项(稍微使用了express,但我认为没有它也可以正常工作)。假设您导入了一个模型。而且,假设Blog 是您的模型的名称。

    const app = express();
    const Blog = require('./models/blog');
    
    app.post('/example', (req, res) => {
      Blog.findOne({name: 'collectionname'})
      .then(result => {
        if(result) {
          //If it exists
        }
      })
    })
    
    

    '''
    resultnullobject

    【讨论】:

    • 搜索'collectionname' 可能会让人感到困惑,因为在此示例中这只是您博客的名称,而且它永远不会包含集合名称。但否则这是一个有用的答案,谢谢!
    【解决方案2】:

    这对我有用(猫鼬版本 5.1.1):

    const mongoose = require('mongoose');
    const mongoURI = 'mongodb://localhost:27017/mydb'
    // notice the mongoose.createConnection instead of mongoose.connect
    const conn = mongoose.createConnection(mongoURI);
    conn.on('open', function () {
        conn.db.listCollections().toArray(function (err, collectionNames) {
          if (err) {
            console.log(err);
            return;
          }
            console.log(collectionNames);
            conn.close();
        });
    });
    

    【讨论】:

    • 我喜欢你引用了常量(mongoosemongoURIconn),我觉得在接受的答案中缺少这些常量,因为你的答案是真实世界的例子,mongoose.connection.db.listCollections没有明确定义如何应用解决方案。
    【解决方案3】:

    选项 2 可能是最干净的。假设您有一个名为 conn 的 Mongoose Connection 对象,该对象已使用 mongoose.createConnection 打开,您可以通过 conn.db 访问本机 mongo Db 对象。从那里您可以致电collectionNames,它应该会提供您要查找的内容:

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

    您还可以将集合名称作为参数传递给collectionNames,以将结果过滤为您正在寻找的内容。

    Mongoose 4.x 更新

    在 Mongoose 4.x 使用的 MongoDB 本机驱动程序的 2.x 版本中,collectionNames 已被替换为 listCollections,后者接受过滤器并返回游标,因此您可以这样做:

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

    【讨论】:

      【解决方案4】:

      在收藏列表中查找收藏

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

      【讨论】:

      • 是 Node.js,不是 PHP ;(
      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多