如何在猫鼬中进行原始mongodb操作?


70

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

猫鼬该怎么做?我现在能做的就是创建连接,而在mongoose的官方网站上找不到任何文档。

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

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

但是如何:

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

Answers:


51

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

基本上,您可以通过执行此操作来访问node-mongodb-native驱动程序YourModel.collection,然后可以insertremove或者drop或根据需要进行任何操作。

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

编辑:

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


1
关于“直接使用mognodb-native”,我发现如果我在mongoose模式中定义了索引,如果我使用mongodb-native直接插入一些数据,它们将无法正常工作。
Freewind

那很有意思。我以为suresureIndex是在启动时运行的?嗯 嗯,是的,但这是在您的测试套件中,因此根本不进行Mongoose调用。
贾蒙德·弗格森

我有一个复杂的MongoDB脚本,该脚本从命令行运行,如下所示:$ mongo mydb task.js由于我无法在服务器环境中运行Shell脚本,并且需要安排上述任务,因此我认为可以从以下位置运行Mongo脚本:节点脚本。通过本地驱动程序可以做到吗?
山姆

3
这个答案是指不是很清楚的文档。为什么不直接编写代码链接到文档中的特定页面。
basickarl

3
我在该页面上看不到“ Driver Access”。
rtf

71

您可以通过使用本机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。有关更多信息,请参见此处此处


1
我认为这是对本机驱动程序的最佳通用访问方式。对于在原猫鼬API文档的搜索,这里是链接Connection.prototype.dbmongoosejs.com/docs/api.html#connection_Connection-db
edmundo096

1
您如何打印查询结果?
CodyBugstein

我知道这很古老,但是对于仍然发现此问题的人来说,您可以这样做以获取结果:Mongoose.connection.db.collection('collectionname').find({}).toArray((err,results) => { console.log(results); });
Matt Fiocca

8

用它来运行猫鼬的原始操作。

  Model_name.collection.insertMany(array, { ordered: false },function(err, success){
            console.log(success);
        });

3
这个答案需要一个模型。该问题询问如何使用“原始mongodb”,这意味着用户可能不需要模型的附加要求。
蒸汽动力

2

遇到了同样的麻烦,在测试后清理数据库,并且实际答案仅因缺少“代码块”而感到困惑,因此再次挖掘文档/代码,以节省其他时间;

猫鼬集合扩展了Mongodb集合

/ * * section 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,allallowed(请参阅文档

5.删除收藏

connection.collection('notsonewcollection').drop()

一切正常。但是,如何检查集合是否存在?如果我不使用connection.listCollections(),则会收到一个错误消息:listCollections不是一个函数
mcAngular2 '18

@ mcAngular2检查文档mongoosejs.com/docs/api.html#connection_Connection-collections connection.collections
2oppin

2
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);
  });
}

2
口头解释通常会有所帮助
con

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.