标签: mongoose

一旦完成,正确关闭mongoose的连接

我在一个不打算连续运行的脚本中使用mongoose,我正面临着一个看似非常简单的问题,但我找不到答案; 简单地说,一旦我调用任何mongoose函数发送请求到mongodb我的nodejs实例永远不会停止,我必须手动杀死它,比如Ctrl + c或Program.exit().

代码看起来大致如下:

var mongoose = require('mongoose');

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ?
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models

// if I include this line for example, node never stop afterwards
var MyModel =  mongoose.model('MyModel', MySchema);
Run Code Online (Sandbox Code Playgroud)

我尝试添加对mongoose.disconnect()的调用,但没有结果.除此之外,一切正常(找到,保存,......).

这个问题与此人完全相同,遗憾的是他没有收到任何答复:https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

谢谢

编辑:接受下面的答案,因为它在技术上是正确的,但如果有人再次遇到这个问题,似乎mongoose和/或mongodb驱动程序实际上并没有关闭连接时,如果仍然有查询运行.

它根本不记得断开连接调用,一旦查询完成运行它就不会这样做; 它只是丢弃你的调用,没有抛出异常或任何类型的东西,从来没有真正关闭连接.

所以你有它:确保在调用disconnect()之前已经处理了每个查询,如果你想让它真正起作用的话.

mongoose mongodb node.js

128
推荐指数
5
解决办法
10万
查看次数

如何使用Mongoose访问预先存在的集合?

question在数据库中有300个对象的大集合test.我可以通过MongoDB的交互式shell轻松地与这个集合进行交互; 但是,当我尝试通过Mongoose在express.js应用程序中获取集合时,我得到一个空数组.

我的问题是,如何访问这个已经存在的数据集而不是在Express中重新创建它?这是一些代码:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');
mongoose.model('question', new Schema({ url: String, text: String, id: Number }));

var questions = mongoose.model('question');
questions.find({}, function(err, data) { console.log(err, data, data.length); });
Run Code Online (Sandbox Code Playgroud)

这输出:

null [] 0
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js express

122
推荐指数
6
解决办法
10万
查看次数

MongoDB和Mongoose之间的区别

我想使用mongodb数据库,但我注意到有两个不同的数据库,有自己的网站和安装方法:mongodb和mongoose.所以我想问自己这个问题:"我使用哪一个?".

所以为了回答这个问题,我问社区你是否可以解释这两者之间有什么区别?如果可能的利弊?因为他们看起来和我很相似.

mongoose mongodb node.js

114
推荐指数
8
解决办法
7万
查看次数

如何使用mongoose生成ObjectId?

我想ObjectId用Mongoose 生成一个MongoDB .有没有办法ObjectId从Mongoose 访问构造函数?

  • 这个问题是关于从头开始生成新的 ObjectId.生成的ID是全新的通用唯一ID.

  • 另一个问题是关于ObjectId现有字符串表示创建一个.在这种情况下,您已经有一个ID的字符串表示 - 它可能是也可能不是普遍唯一的 - 并且您正在将其解析为ObjectId.

mongoose mongodb node.js

113
推荐指数
4
解决办法
10万
查看次数

在Javascript中,等待一些异步任务完成的最简单方法是什么?

我想删除一些mongodb集合,但这是一个异步任务.代码将是:

var mongoose = require('mongoose');

mongoose.connect('mongo://localhost/xxx');

var conn = mongoose.connection;

['aaa','bbb','ccc'].forEach(function(name){
    conn.collection(name).drop(function(err) {
        console.log('dropped');
    });
});
console.log('all dropped');
Run Code Online (Sandbox Code Playgroud)

控制台显示:

all dropped
dropped
dropped
dropped
Run Code Online (Sandbox Code Playgroud)

all dropped在删除所有集合后,最简单的方法是打印什么?任何第三方都可用于简化代码.

javascript asynchronous synchronous mongoose node.js

112
推荐指数
5
解决办法
17万
查看次数

生产代码中的Mongoose索引

每猫鼬文档MongooseJSMongoDB/ Node.js:

当您的应用程序启动时,Mongoose会自动调用ensureIndex架构中的每个已定义索引.虽然很适合开发,但建议在生产中禁用此行为,因为创建索引会对性能产生重大影响.通过将autoIndex架构选项设置为false来禁用该行为.

这似乎指示在部署之前从mongoose中删除自动索引以优化Mongoose,指示Mongo在应用程序启动时转到所有索引,这似乎是有道理的.

在生产代码中处理索引的正确方法是什么?也许外部脚本应该生成索引?或者,ensureIndex如果单个应用程序是集合的唯一读取器/写入器,则可能是不必要的,因为每次DB写入时它都会继续索引?

编辑:为了补充,MongoDB提供了有关如何进行索引的良好文档,但没有为什么何时应该执行显式索引指令.在我看来,编写器应用程序应该在具有现有索引的集合上自动更新索引,这实际上更像是一次性的事情(在应用新索引时完成),在这种情况下,Mongoose 应该是一个正常服务器重启后的无操作.ensureIndexautoIndex

mongoose mongodb node.js

112
推荐指数
2
解决办法
2万
查看次数

Mongoose子文档与嵌套模式

我很好奇在我的主模式中使用子文档与更深层的优缺点:

var subDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [subDoc]
});
Run Code Online (Sandbox Code Playgroud)

要么

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});
Run Code Online (Sandbox Code Playgroud)

我现在到处都在使用subdocs,但我主要想知道性能或查询我可能会遇到的问题.

javascript mongoose mongodb node.js

111
推荐指数
5
解决办法
8万
查看次数

Mongoose - 强制集合名称

我正在尝试使用mongoose来创建数据库和集合.我的代码是:

var mongoose = require('mongoose');
    var db = mongoose.connect('mongodb://localhost/testdb');
    var Schema = mongoose.Schema;

    var UserInfo = new Schema({
    username : String,
    password : String 
    });

    mongoose.model('UserInfo', UserInfo);

    var user = db.model('UserInfo');


    var admin = new user();
    admin.username = "sss";
    admin.password = "ee";
    admin.save();
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,mongoose创建了名为UserInfo而不是userinfo的集合.如何在mongoose中强制收集名称?

mongoose mongodb

109
推荐指数
8
解决办法
5万
查看次数

猫鼬(mongodb)批量插入?

请问猫鼬V3.6 +支持批量插入呢?我已经搜索了几分钟,但是这个查询的任何内容都是几年前的答案,答案是明确的.

编辑:

为了将来参考,答案是使用Model.create().create()接受一个数组作为其第一个参数,因此您可以将文档作为数组插入.

请参见Model.create()文档

mongoose mongodb node.js

109
推荐指数
6
解决办法
10万
查看次数

单节点.js项目中的Mongoose和多个数据库

我正在做一个包含子项目的Node.js项目.一个子项目将有一个Mongodb数据库,Mongoose将用于包装和查询db.但问题是

  • Mongoose不允许在单个mongoose实例中使用多个数据库,因为模型是在一个连接上构建的.
  • 要使用多个mongoose实例,Node.js不允许多个模块实例,因为它具有缓存系统require().我知道在Node.js中禁用模块缓存,但我认为这不是一个好的解决方案,因为它只需要mongoose.

    我曾尝试使用createConnection()openSet()猫鼬,但它不是解决方案.

    我试图深度复制mongoose实例(http://blog.imaginea.com/deep-copy-in-javascript/)以将新的mongoose实例传递给子项目,但它会抛出RangeError: Maximum call stack size exceeded.

我想知道是否有使用多个数据库与mongoose或任何解决方法来解决这个问题?因为我认为猫鼬非常容易和快速.或任何其他模块作为建议?

javascript database mongoose mongodb node.js

108
推荐指数
5
解决办法
8万
查看次数