标签: node-mongodb-native

如何检查Mongodb native nodejs驱动程序中是否存在集合?

我需要检查某个数据库中是否存在集合,如果不存在则创建它.我知道

db.createCollection(collName, {strict:true}, function(error, collection))
Run Code Online (Sandbox Code Playgroud)

collName在创建之前检查是否存在集合并设置error对象.但我需要一个独立的功能来检查.

mongodb node.js node-mongodb-native

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

为什么我收到错误"试图打开未关闭的连接."?

我正在尝试通过mongoose将我的节点应用程序连接到mongodb.它似乎正在工作,因为我可以添加文档,但我得到错误{ [Error: Trying to open unclosed connection.] state: 2 }.

我创建了一个非常简单的应用程序,只是为了确保在连接我的实际应用程序之前一切正常.

这是我的简单应用程序:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var timeSchema = new Schema({ timestamp: String });
var Time = mongoose.model('Time', timeSchema);

mongoose.connect('mongodb://localhost/mydb');

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error: '));
db.once('open', function () {

  var testA = new Test({ timestamp: Date() });

});
Run Code Online (Sandbox Code Playgroud)

我也试过添加db.close()到最后,但它没有任何区别.

这是在Ubuntu 14.04 VPS上运行的:

  • Node.js v0.10.3
  • MongoDB 2.6.3
  • 猫鼬1.4.21

mongoose node.js node-mongodb-native

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


使用Mongo集合中的二进制数据作为图像源

我有一个快速应用程序,使用Jade作为视图引擎将数据存储在mongo中.我有一个简单的路线,可以获取特定集合中的文档,每个文档对应一个产品.该图像是base64编码的.当我尝试渲染为图像虽然它不起作用

我的路线是

exports.index = function(req, res){
   mongo.getProducts(function(data) {
      res.render('consumer/index', {user: req.session.user, products: data});
   });
};
Run Code Online (Sandbox Code Playgroud)

调用的函数是

exports.getProducts = function(callback) {

   Product.find().exec(function(err, products){
      return callback(products);
   });
};
Run Code Online (Sandbox Code Playgroud)

然后我的Jade文件有以下代码

each val in products
  img(src="data:image/png;base64,'+#{val.image.data}+'", alt='Image', style="width: 20px; height: 20px")
Run Code Online (Sandbox Code Playgroud)

直接在Mongo(通过robomongo)查看文档,我得到了这个

在此输入图像描述

在此输入图像描述

我不知道我缺少什么,因为在另一个文件中我使用jQuery数据表来显示文档,并且相同的方法正确呈现图像,这里是数据表代码的片段

"aoColumns": [
          {"mData": "name"},
          {"mData": "price"},
          {"mData": "category"},
          {"mData": "description"},
          {"mData": "image.data", "mRender": function ( data, type, full ) {
            return '<img src="data:image/png;base64,'+data+'", style="width: 20px; height: 20px"></>'}},
          {"mData": "promoted"},
          {"mData": null}
        ]
Run Code Online (Sandbox Code Playgroud)

node.js node-mongodb-native pug

24
推荐指数
1
解决办法
4515
查看次数

MongoDB按嵌套对象值排序

我正在尝试根据嵌套对象的值对结果进行排序.使用node-mongodb-native,我这样做:

    this.collection.find({
          "_id": ObjectID(item_id) }, 
        { "items": 1 },
        { sort : { items.date : 1 }
    }, function(err, result) {
        if (err) {
            callback(err);
        } else {
            callback(null, result);
        }
    });
Run Code Online (Sandbox Code Playgroud)

我收到了意外的令牌错误items.date.

items是一个对象数组.有些文件是空数组,有些文件包含数据,包含date字段.

谢谢!

javascript mongodb node-mongodb-native

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

按ID删除记录?

为什么我不能通过_id删除记录?

码:

db.collection('posts', function(err, collection) {
   collection.remove({_id: '4d512b45cc9374271b00000f'});
});
Run Code Online (Sandbox Code Playgroud)

mongodb node.js node-mongodb-native

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

如何使用统一拓扑设置自动重新连接

设置后useUnifiedTopology=true,自动重新连接停止工作并生成以下错误:

DeprecationWarning: The option `reconnectInterval` is incompatible with the unified topology
DeprecationWarning: The option `reconnectTries` is incompatible with the unified topology
DeprecationWarning: The option `autoReconnect` is incompatible with the unified topology
Run Code Online (Sandbox Code Playgroud)

我怎样才能让服务器自动重新连接那个新标志?

我正在使用mongoose.createConnection以下选项进行连接:

{
        autoReconnect: true,
        keepAliveInitialDelay: 300000,
        connectTimeoutMS: 300000,
        reconnectTries: Number.MAX_VALUE,
        reconnectInterval: 1000,
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        poolSize: 10,
        auth: {
            authSource: "admin"
        },
        user: process.env.MONGO_USER,
        pass: process.env.MONGO_PASS
    }
Run Code Online (Sandbox Code Playgroud)

mongoose node.js node-mongodb-native

16
推荐指数
1
解决办法
5904
查看次数

在express.js中连接Mongodb-Native-Driver

我在express.js应用程序中使用mongodb-native-driver.我在数据库中有大约6个集合,所以我创建了6个js文件,每个文件都有一个集合作为javascript对象(例如function collection(){}),原型函数处理这些集合上的所有操作.我认为这将是一个很好的架构.

但我遇到的问题是如何连接到数据库?我应该在每个文件中创建一个连接并使用它们吗?我认为这将是一种矫枉过正,因为mongodb-native-driver中的连接创建了一个连接池,并且其中有几个连接不合理.

那么如何创建单个连接池并在所有collections.js文件中使用它?我希望得到像在mongoose中实现的连接.如果我在应用程序架构中的任何思维过程都是错误的,请告诉我.

使用Mongoose可以解决这些问题,但我在几个地方读过它比本机驱动程序慢,而且我更喜欢无模式模型.

编辑:我用模型创建了一个模块.每个集合都在一个文件中,它将数据库作为参数.现在在index.js文件中,我调用数据库连接并在从连接获取数据库后保留变量db.(我使用了自动重新连接功能来确保连接没有丢失).在同一个index.js文件中,我像这样导出了每个集合

exports.model1 = require('./model1').(db)
exprorts.model2 = require('./model2').(db)
Run Code Online (Sandbox Code Playgroud)

这确保了数据库的一部分,在短短一个模块处理和应用程序只需调用每个model.js文件中导出函数一样save(),fincdbyid()等(whatever you do in the function is upto you to implement).

mongodb node.js express node-mongodb-native

13
推荐指数
1
解决办法
6154
查看次数

如何在node.js中断开连接期间缓冲MongoDB插入?

我们读取了一个xml-stream包含大约500k元素的XML文件(使用),并将它们插入到MongoDB中,如下所示:

xml.on(`endElement: product`, writeDataToDb.bind(this, "product"));
Run Code Online (Sandbox Code Playgroud)

插入writeDataToDb(type, obj)如下:

collection.insertOne(obj, {w: 1, wtimeout: 15000}).catch((e) => { });
Run Code Online (Sandbox Code Playgroud)

现在当Mongo连接断开连接时,xml流仍然会读取并且控制台充满了错误消息(无法插入,断开连接,EPIPE损坏,......).

文档中它说:

当你关闭mongod进程时,驱动程序停止处理操作并继续缓冲它们,因为bufferMaxEntries默认为-1意味着缓冲所有操作.

这个缓冲区实际上做了什么?

我们注意到当我们插入数据并关闭mongo服务器时,事情得到缓冲,然后我们将mongo服务器重新启动,本机驱动程序成功重新连接,节点恢复插入数据但缓存的文件(在mongo beeing offline期间)不插入再次.

所以我质疑这个缓冲区及其用途.

目标:

我们正在寻找最好的方式(根据15000milliseconds保持刀片在缓冲区中,直到蒙戈回来wtimeout),并让然后将缓冲的文件或利用xml.pause();xml.resume()我们尝试没有成功.

基本上我们需要一些帮助来处理如何在没有数据丢失或中断的情况下处理断开连接.

reconnect mongodb node.js node-mongodb-native

13
推荐指数
1
解决办法
2249
查看次数

使用es7 async/await检查mongodb中是否存在文档

我正在尝试检查具有email提供的用户是否存在于集合中users,但我的函数对于每个调用都保持返回undefined.我使用es6并且async/await为了摆脱大量的回调.这是我的函数(它在一个类中):

async userExistsInDB(email) {
    let userExists;
    await MongoClient.connect('mongodb://127.0.0.1:27017/notificator', (err, db) => {
        if (err) throw err;

        let collection = db.collection('users');

        userExists = collection.find({email: email}).count() > 0;
        console.log(userExists);

        db.close();
    });
    console.log(userExists);
    return userExists;
}
Run Code Online (Sandbox Code Playgroud)

所以,调用console.log内部的第一个.connect总是返回,false因为返回的值.find不是数组,它是一个巨大的对象,如下所示:

{ connection: null,
  server: null,
  disconnectHandler: 
   { s: { storedOps: [], storeOptions: [Object], topology: [Object] },
     length: [Getter] },
  bson: {},
  ns: 'notificator.users',
  cmd: 
   { find: 'notificator.users',
     limit: 0,
     skip: 0,
     query: …
Run Code Online (Sandbox Code Playgroud)

mongodb node.js node-mongodb-native ecmascript-7

12
推荐指数
1
解决办法
5556
查看次数