我正在使用mongo和node.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)
但是我如何连接到多台服务器,在我的情况下有两台服务器。
我有一个以这种格式存储数据的集合:
{
_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进行此查询.
我已经快速浏览了一下并没有发现任何让我满意的答案,但基本上我已经开始使用带有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行代码和额外的数据库调用.
我想使用节点的本机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) 我使用以下代码将文档保存到数据库:
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)
我使用以下代码循环插入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 + 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) 例如,我的数据是{'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,我可以将数据附加到现有键的值上;
但是有一些问题:
这是我的猫鼬架构:
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)
上面的代码运行良好,但问题是: