如何在mongoose中执行原始mongodb操作?

如何在mongoose中执行原始mongodb操作?,mongodb,mongoose,Mongodb,Mongoose,我这样问是因为当我编写单元测试时,我想删除测试数据库,插入一些初始化数据,并在测试中检查mongodb中的数据。所以我需要对mongodb进行原始操作 如何在猫鼬身上做到这一点?我现在能做的就是创建连接,而不是在mongoose的官方网站上找到任何文档 var mongoose = require('mongoose'); mongoose.connect('mongo://localhost/shuzu_test'); // get the connection var conn =

我这样问是因为当我编写单元测试时,我想删除测试数据库,插入一些初始化数据,并在测试中检查mongodb中的数据。所以我需要对mongodb进行原始操作

如何在猫鼬身上做到这一点?我现在能做的就是创建连接,而不是在mongoose的官方网站上找到任何文档

 var mongoose = require('mongoose');
 mongoose.connect('mongo://localhost/shuzu_test');

 // get the connection
 var conn = mongoose.connection;
但如何:

  • 删除数据库
  • 创建一个集合
  • 将一些数据写入集合
  • 查询集合
  • 放弃收藏
  • 请参阅文档中的“驱动程序访问”部分:

    基本上,您可以通过执行
    YourModel.collection
    来访问驱动程序,然后您可以
    insert
    remove
    drop
    或任何您需要的操作

    没有文档,但通过这种方法,您可以访问此处的所有内容:

    编辑:


    在您的情况下,您可能希望跳过在测试套件中使用mongoose,直接使用,甚至编写一个可以在测试开始之前运行的简单命令。

    您可以使用
    mongoose.connection.db
    使用本机NodeJS驱动程序运行mongodb命令。这将访问NodeJS MongoDB驱动程序,您不需要创建mongoose模型

    插页 更新 您可以使用数据库连接db reference
    mongoose.connection.db
    发送特定于该数据库的每个命令

    这是mongoose API文档:


    重要:注意NodeJS驱动程序中的一些选项与mongodbshell命令中的选项不同。例如
    findOneAndUpdate()
    使用
    returnOriginal
    而不是
    returnNewDocument
    。有关这方面的更多信息,请参阅和。

    使用此选项在mongoose中运行原始操作

      Model_name.collection.insertMany(array, { ordered: false },function(err, success){
                console.log(success);
            });
    
    遇到同样的问题,在测试后清理DBs,实际答案只是因为缺少“代码块”而混淆,所以再次挖掘文档/代码,以节省其他人的时间发布此信息;)

    Mongoose集合扩展了Mongodb集合

    /* *第collection.js节 * */

    接口CollectionBase扩展了mongodb.Collection{

    文件:

    连接也是如此:

    require('mongoose')公开的连接类 实际上是驱动程序的NativeConnection类。 connection.js定义本机 版本扩展。请参阅:

    因此,可以对采集/连接执行所有“原始”操作, 假设你有

     var connection = mongoose.connection;
    
    然后:

    1.删除数据库:

    connection.dropDatabase()
    
    2.创建一个集合

    connection.collection('newcollection') // creates if not exists
    
    connection.collection('mybenotnewcollection').bulkWrite([
      { insertOne: { whatewer: { you: 'need' } } },
    ]);
    
    connection.collection('notsonewcollection').drop()
    
    3.将一些数据写入集合

    connection.collection('newcollection') // creates if not exists
    
    connection.collection('mybenotnewcollection').bulkWrite([
      { insertOne: { whatewer: { you: 'need' } } },
    ]);
    
    connection.collection('notsonewcollection').drop()
    
    4.查询集合

    connection.collection('newcollection') // creates if not exists
    
    connection.collection('mybenotnewcollection').bulkWrite([
      { insertOne: { whatewer: { you: 'need' } } },
    ]);
    
    connection.collection('notsonewcollection').drop()
    
    这显然不是一个问题:findAll、find、aggregate、all-allowed(参见)

    5.删除收藏

    connection.collection('newcollection') // creates if not exists
    
    connection.collection('mybenotnewcollection').bulkWrite([
      { insertOne: { whatewer: { you: 'need' } } },
    ]);
    
    connection.collection('notsonewcollection').drop()
    

    mongoose对象有一个mongo原型,它允许您访问本机mongo驱动程序

    mongoose.mongo
    

    关于“直接使用mognodb本机”,我发现如果我在mongoose模式中定义索引,如果我使用mongodb native直接插入一些数据,它们将不会很好地工作。这很有趣。我以为ensureIndex是在启动时运行的?嗯。啊,是的,但这在您的测试套件中,所以它根本不执行mongoose调用。我有一个复杂的mongodb脚本,作为f从命令行运行下面:$mongo mydb task.js由于我无法在服务器环境中运行shell脚本,需要安排上述任务,我想我可以从节点脚本运行mongo脚本。这是否可以通过本机驱动程序实现?这个答案涉及的文档不是很清楚。为什么不编写代码并链接到特定页面在文档中。我没有看到“驱动程序访问”在该页面上。我认为这是访问本机驱动程序的最佳常规方式。对于那些在原始Mongoose API文档中搜索的人,这里是
    Connection.prototype.db
    :如何打印查询结果?我知道这很旧,但对于仍在查找的人,您可以这样做以获得结果:
    >Mongoose.connection.db.collection('collectionname').find({}).toArray((err,results)=>{console.log(results);});
    这个答案要求存在一个模型。问题是如何使用“原始mongodb”,这意味着用户可能不需要模型的附加要求。工作正常。但如何检查集合是否存在?如果我正在取消连接。listCollections(),我将收到一个错误:listCollections不是function@mcAngular2检查文档连接。收集口头解释通常很有帮助