74

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

如何在猫鼬中做到这一点?我现在能做的只是创建连接,并在猫鼬的官方网站上找不到任何文档。

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

 // get the connection
 var conn = mongoose.connection;

但是如何:

  1. 删除数据库
  2. 创建一个集合
  3. 将一些数据写入集合
  4. 查询一个集合
  5. 删除一个集合
4

6 回答 6

76

您可以使用原生 NodeJS 驱动程序运行 mongodb 命令,方法是使用mongoose.connection.db. 这将访问 NodeJS MongoDB 驱动程序,您无需创建 mongoose 模型

一个插入

mongoose.connection.db.collection('userCollection').insert({
  username: 'captain1',
  firstName: 'Steve',
  lastName: 'Rogers', 
});

更新

mongoose.connection.db.collection('userCollection').update(
  {someFilterProperty: true},
  {$set: {
     siteId: new mongoose.mongo.ObjectId('56cb91bdc5946f14678934ba'),
     hasNewSiteId: true}},
  {multi: true});
});

您可以使用数据库连接数据库参考发送特定于该数据库的每个命令mongoose.connection.db

这是猫鼬 API 文档: http: //mongoosejs.com/docs/api.html#connection_Connection-db

重要提示:注意 NodeJS 驱动程序中的一些选项与 MongoDB shell 命令中的选项不同。例如findOneAndUpdate()使用returnOriginal而不是returnNewDocument. 有关更多信息,请参见此处此处

于 2016-11-27T21:02:04.793 回答
53

请参阅文档中有关“驱动程序访问”的部分:http: //mongoosejs.com/

基本上,您可以通过执行来访问node-mongodb-native驱动程序YourModel.collection,然后您可以insertremovedrop或您需要的任何东西。

没有文档,但通过这种方法,您可以访问此处的所有内容: https ://mongoosejs.com/docs/api.html#collection-js

编辑:

在您的情况下,您可能希望跳过在测试套件中使用 mongoose 并直接使用 node-mongodb-native,或者甚至编写一个可以在测试开始之前运行的简单mongodb shell 脚本。

于 2012-05-09T15:46:15.247 回答
6

使用它在猫鼬中运行原始操作。

  Model_name.collection.insertMany(array, { ordered: false },function(err, success){
            console.log(success);
        });
于 2017-01-24T13:52:18.110 回答
3

遇到了同样的麻烦,在测试后清理数据库,而实际答案只是因为缺少“代码块”而感到困惑,所以再次挖掘文档/代码,为了节省时间,发布这个;)

Mongoose 集合扩展了 Mongodb 集合

/* * 部分 collection.js * http://mongoosejs.com/docs/api.html#collection-js */

接口 CollectionBase 扩展 mongodb.Collection {

文档: http: //mongodb.github.io/node-mongodb-native/2.1/api/Collection.html

连接也是如此:

require('mongoose') 暴露的 Connection 类实际上是驱动的 NativeConnection 类。connection.js 定义了原生版本扩展的基类。请参阅: http: //mongoosejs.com/docs/api.html#drivers-node-mongodb-native-connection-js

所以所有“RAW”操作都可以在收集/连接上执行,假设你有

 var connection = mongoose.connection;

然后:

1.删​​除数据库:

connection.dropDatabase()

2.创建一个集合

connection.collection('newcollection') // creates if not exists

3.将一些数据写入集合

connection.collection('mybenotnewcollection').bulkWrite([
  { insertOne: { whatewer: { you: 'need' } } },
]);

4.查询一个集合

这显然不是一个问题:findAll, find, aggregate, all allowed (see the Docs )

5.删除一个集合

connection.collection('notsonewcollection').drop()
于 2017-12-29T08:02:09.740 回答
3
const mongoose = require('mongoose');
mongoose.connect(uri, options);
var db = mongoose.connection;
db.once('open', function () {
  db.collection('collection').find().toArray(function(err, result){
        console.log(result);
  });
}
于 2020-04-09T18:59:56.170 回答
1

mongoose 对象有一个 mongo 原型,可让您访问本机 mongo 驱动程序

mongoose.mongo
于 2020-08-14T04:12:18.480 回答