标签: node-mongodb-native

node.js mongodb如何连接到mongo服务器的副本集

我正在使用mongonode.js在应用程序中。mongo数据库由两个服务器组成。

http://howtonode.org/express-mongodb中给出的示例中,我可以使用以下方法连接到一台服务器:

ArticleProvider = function(host, port) {
 var database = 'node-mongo-blog';
 this.db= new Db(database, new Server(host, port, {auto_reconnect: true}, {}));
 this.db.open(function(){});
};
Run Code Online (Sandbox Code Playgroud)

但是我如何连接到多台服务器,在我的情况下有两台服务器。

mongodb node.js node-mongodb-native

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

如何格式化mongodb查找查询的结果?

我有一个以这种格式存储数据的集合:

{
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd'
    details: {
        varA: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        },
        varB: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够只显示这种格式的varA数据(没有嵌套的深度...):

{ 
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd',
    created: "2013-06-13T12:43:25.853Z",
    validity: "2013-07-13T12:43:25.853Z",
    modified: "2013-06-13T12:43:25.853Z"
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的查询(我使用投影):

db.coll.find({}, {'details.varB': 0})
Run Code Online (Sandbox Code Playgroud)

返回这样的东西:

{
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd',
    details: {
        varA: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        }
}
Run Code Online (Sandbox Code Playgroud)

如何改进查找查询以返回预期的格式?

非常感谢那些能帮助我的人;-)

PS这里我使用mongo shell来检索数据,但我需要使用node-mongodb-native的node.js进行此查询.

mongodb node-mongodb-native

4
推荐指数
1
解决办法
3167
查看次数

Nodejs驱动程序支持哪些聚合游标方法?

正如您在2.6上看到的Mongodb aggregate()操作返回一个游标,但是行为与从a返回的普通游标有点不同find().我使用本机mongodb nodejs驱动程序,并找不到有关可用聚合游标方法的正确文档.

例如,一个不能运行count()在汇聚光标然而,有两种方法,例如cursor.objsLeftInBatch()cursor.itcount()Ñ蒙戈壳.我在nodejs本机驱动程序的源代码中找不到它们中的任何一个.Nodejs本机驱动程序或Mongoose支持哪些聚合游标方法?

mongoose mongodb node.js node-mongodb-native

4
推荐指数
1
解决办法
3234
查看次数

mongodb nodejs每个vs toArray

我已经快速浏览了一下并没有发现任何让我满意的答案,但基本上我已经开始使用带有express和mongodb的node.js来创建webapi而不是通常的.Net MVC Web API路由.

我注意到的一件事是,为了返回一系列结果,我正以一种相当笨重的方式做到这一点,或者至少它是这样的.

app.get('/property', function (req, res) {
    var propArray = [];
    MongoClient.connect(settings.connection,
        function (err, db) {
            if (err) throw err;

            var properties = db.collection("PROPERTIES");

            var searchParams = {
                Active: true,
                Deleted: false
            }

            properties.count(searchParams, function (err, count) {
                properties.find(searchParams).toArray(function (err, result) {
                    for (i = 0; i < count; i++)
                        propArray.push(new models.propertyModel(result[i]));

                    db.close();

                    return res.json(propArray);
                });
            });
        }
    );
});
Run Code Online (Sandbox Code Playgroud)

现在我已经注意到有一个.each函数而不是.toArray我想要使​​用的.count函数,因为我可以删除函数,但显然你只能返回一次响应.我想知道你们是否可以用你们的一些mongo知识来启发我.

properties.find(searchParams).each(function (err, result) {
    return res.json(result);
});
Run Code Online (Sandbox Code Playgroud)

这样的东西,削减了6行代码和额外的数据库调用.

node.js express node-mongodb-native

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

更改mongo数据库

我想使用节点的本机2.0 mongodb驱动程序查询我的副本集中的集合.我可以连接和验证admin数据库,但如何切换数据库来查询我感兴趣的集合?

var mongodb  = require('mongodb');
var MongoClient = mongodb.MongoClient;

var url = "mongodb://user:pass@db1,db2,db3/admin";

MongoClient.connect(url, function(err, db) {

    console.log("Connected correctly to server");
    console.log("Current database", db.databaseName);

    // switch context to database foo
    // foo.bar.findOne();

    db.close();

});
Run Code Online (Sandbox Code Playgroud)

mongodb node.js node-mongodb-native

4
推荐指数
1
解决办法
4748
查看次数

MongoDb在db.close()上抛出错误

我使用以下代码将文档保存到数据库:

MongoClient.connect(mongoUrl, function(error, db) {
    console.log('Mongo: error = \'' + error + '\' db = \'' + db + '\'');
    insertDocument(db, parsedDocument);
    db.close();
});

function insertDocument(db, document) {
    db.collection('test').insertOne(document, function(error, result) {
        console.log('Save document.  error = \'' + error + '\' result = \'' + result + '\'');
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将db.close()语句留在中,则会在错误对象中出现错误.如果我删除该行,则保存文档.

Received.  ID: '04023828-9ef3-4f10-b1d1-108208c9e3b7'
Mongo: error = 'null' db = '[object Object]'
Save document.  error = 'MongoError: server localhost:27017 sockets closed' result = 'undefined'
Run Code Online (Sandbox Code Playgroud)
  1. 为什么关闭数据库会导致错误?
  2. 不明确关闭连接是否安全?

javascript mongodb node.js node-mongodb-native

4
推荐指数
1
解决办法
2322
查看次数

[Node.js]循环通过本机驱动程序将1000000个文件插入mongodb,为什么节点会占用大量内存?

我使用以下代码循环插入1000000文档到mongodb,但我发现节点进程占用了大量内存,我的客户端已经死了.

db.collection("batch_insert", function (err, collection) {
    if (!err) {
        var count = 0;
        for (var i = 0; i < 1000000; i++) {
            collection.insert({hello:'world', ok:'OKOKOK'}, {safe:true, serializeFunctions:false}, function (err, result) {
                count++;
                if (1000000 == count) {
                    db.close();
                }
            });
        }
    } else {
        console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

node.js node-mongodb-native

3
推荐指数
1
解决办法
5097
查看次数

将DB引用到路由中对我的Node/Express项目不起作用

我正在使用node + express创建一个简单的REST API,并试图将路由逻辑从db逻辑中分离出来.我在从路由访问数据库时遇到问题.

这是我的server.js代码:

var express = require('express')
  , path = require('path')
  , http = require('http')
  , mongo = require('mongodb');

// Configure Express app
var app = express();
app.configure(function () {
    app.set('port', process.env.PORT || 3000);
    app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
    app.use(express.bodyParser()),
    app.use(express.static(path.join(__dirname, 'public')));
});

// Configure DB
var Server = mongo.Server
  , Db = mongo.Db
  , BSON = mongo.BSONPure
  , server = new Server('localhost', 27017, {auto_reconnect: true})
  , db = new Db('mydb', server, {safe: true});

// Open …
Run Code Online (Sandbox Code Playgroud)

node.js express node-mongodb-native

3
推荐指数
1
解决办法
2567
查看次数

如何在mongodb中将数据附加到现有键的值

例如,我的数据是{'abc':'def'},它具有单个键值;

我要这个:

do something...//data has been changed to {'abc':'defghi'} or {'abc':'['def','ghi']'}
Run Code Online (Sandbox Code Playgroud)

我在nodejs中使用了以下代码:

                var tmp2 = {'userid:location:2013-01-02 15':['092030', '12122.11260E']};

            collection.insert(tmp2, {safe:true}, function (err, result) {
                var i = 0;
                var a = +new Date();
                while(i<300000){
                    tmp2['userid:location:2013-01-02 15'].push(i);
        collection.save(tmp2, function () { })      
                    i+=1;
                }
                var b = +new Date();
                console.log(b-a)
            });
Run Code Online (Sandbox Code Playgroud)

save api可以替换相同键的值,因此使用push,我可以数据附加到现有键的值上;

但是有一些问题:

  1. 推送操作性能不佳。单次保存可以运行15000 / s,但是使用push时为1500 / s。
  2. 如果我有两个客户端,两个都想要追加数据,则后面的一个将覆盖较早一个的数据,而不是追加。如何解决此问题?是否有API?

mongodb node-mongodb-native

3
推荐指数
1
解决办法
4962
查看次数

Mongoose:如何在不填充第一级字段的情况下填充 2 级深度种群?在 mongodb 中

这是我的猫鼬架构:

var SchemaA = new Schema({
    field1: String,
 .......
 fieldB : { type: Schema.Types.ObjectId, ref: 'SchemaB' }
});

var SchemaB = new Schema({
    field1: String,
 .......
 fieldC : { type: Schema.Types.ObjectId, ref: 'SchemaC' }
});

var SchemaC = new Schema({
    field1: String,
 .......
 .......
 .......
});
Run Code Online (Sandbox Code Playgroud)

当我使用 find 查询访问 schemaA 时,我希望以与我们在 SQL 数据库中应用连接操作相同的方式拥有 SchemaA 的字段/属性以及 SchemaB 和 SchemaC。

这是我的方法:

SchemaA.find({})
 .populate('fieldB')
 .exec(function (err, result){ 

       SchemaB.populate(result.fieldC,{path:'fieldB'},function(err, result){

    .............................
        });

}); 
Run Code Online (Sandbox Code Playgroud)

上面的代码运行良好,但问题是:

  1. 我想通过 SchemaA 获得 SchemaC 的信息/属性/字段,并且我不想填充 SchemaB 的字段/属性。
  2. 不想获取 SchemaB 属性的原因是,额外的填充会降低不必要的查询速度。 …

mongoose mongodb node.js node-mongodb-native

3
推荐指数
1
解决办法
8316
查看次数