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

Posted

技术标签:

【中文标题】如何在猫鼬中进行原始 mongodb 操作?【英文标题】:How to do raw mongodb operations in mongoose? 【发布时间】:2012-05-18 03:58:31 【问题描述】:

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

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

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

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

但是如何:

    删除数据库 创建一个集合 将一些数据写入集合 查询集合 删除一个集合

【问题讨论】:

【参考方案1】:

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

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

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

编辑:

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

【讨论】:

关于“直接使用mognodb-native”,我发现如果我在猫鼬模式中定义索引,如果我使用mongodb-native直接插入一些数据,它们将无法正常工作。 这很有趣。我认为 ensureIndex 是在启动时运行的?唔。啊,是的,但这是在你的测试套件中,所以它根本不做 Mongoose 调用。 我有一个复杂的 MongoDB 脚本,它从命令行运行如下:想我可以从 Node 脚本运行 Mongo 脚本。这可以通过本机驱动程序实现吗? 这个答案是指不是很清楚的文档。为什么不直接编写代码链接到文档中的特定页面。 我在那个页面上看不到“Driver Access”了。【参考方案2】:

您可以通过mongoose.connection.db 使用本机 NodeJS 驱动程序运行 mongodb 命令。这会访问 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 发送特定于该数据库的每个命令。

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

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

【讨论】:

我认为这是本地驱动程序的最佳通用访问方式。对于那些在原始 Mongoose API 文档中搜索的人,这里是 Connection.prototype.db 的链接:mongoosejs.com/docs/api.html#connection_Connection-db 如何打印查询结果? 我知道这已经过时了,但对于那些仍在寻找它的人,你可以这样做以获得结果:Mongoose.connection.db.collection('collectionname').find().toArray((err,results) => console.log(results); );【参考方案3】:

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

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

【讨论】:

这个答案需要一个模型存在。该问题询问如何使用“原始mongodb”,这意味着用户可能不希望模型的附加要求。【参考方案4】:

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

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、aggregated、all allowed(参见Docs)

5.删除收藏

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

【讨论】:

一切正常。但是如何检查集合是否存在?如果我取消 connection.listCollections(),则会收到错误消息:listCollections 不是函数 @mcAngular2 检查文档mongoosejs.com/docs/api.html#connection_Connection-collectionsconnection.collections【参考方案5】:
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);
  );

【讨论】:

口头解释通常很有帮助【参考方案6】:

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

mongoose.mongo

【讨论】:

以上是关于如何在猫鼬中进行原始 mongodb 操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中使用聚合

如何在猫鼬中找到随机记录[重复]

如何在猫鼬中填充模型

如何在猫鼬中插入自动增量编号

如何使用猫鼬需要验证在猫鼬中插入多个文档?

如何在猫鼬中填充另一个模型的子文档?