第三方节点模块,在localhost上创建并填充mongoDB数据库。我正在尝试使用数据库并从我的自定义模块中检索数据。即使我可以成功连接到数据库,它也不会在数据库中显示任何集合或文档。
我对Mongoose文档的印象,首先我要创建模式,然后为我想要使用的每个集合创建mongoDB模型。这些模型是在第三方模块中创建的,我想要使用的集合已经存在于数据库中。
正如你所知,我是这个mongodb + mongoose + nodejs堆栈的新手。我是否正确地在新模块中创建模式和模型 - 这是很多代码重复?或者我错过了什么?
从mongo shell我use gtfs
然后show collections
确认gtfs数据库不为空。
> use gtfs
switched to db gtfs
> show collections
agencies
routes
...
然后确认数据库中还有文档,
> db.routes.find({'route_id':'6182'}).pretty()
{
"_id" : ObjectId("562fcf97090e937d06a34e67"),
"route_id" : "6182",
"agency_id" : "DDOT",
...
}
我从自定义模块连接到数据库:
var mongoose = require('mongoose');
var mongo_url = 'mongodb://127.0.0.1:27017/gtfs';
//Each connection instance maps to a single database
var db = mongoose.createConnection(mongo_url);
console.log('db -> ', db);
我在mongoose文档中读到,当你创建连接时,mongoose会将你的连接对象指向open或openSet方法。所以,我知道我的问题不是创建数据库连接对象而是打开它。
当我打印出db对象时,它显示collections属性为空:
db -> { connections:
[ { base: [Circular],
collections: {},
models: {},
config: [Object],
replica: false,
hosts: null,
host: 'localhost',
port: 27017,
user: undefined,
pass: undefined,
name: 'gtfs',
options: [Object],
otherDbs: [],
_readyState: 2,
_closeCalled: false,
_hasOpened: false,
_listening: false,
_events: {},
db: [Object] } ],
plugins: [],
models: {},
modelSchemas: {},
options: { pluralization: true } }
答案 0 :(得分:2)
在我看来,使用mongodb
驱动程序而不是Mongoose可能更容易(后者在MongoDB文档之上实现了一个额外的层,这很好,但通常在填充数据库时效果更好by Mongoose也是。)
关于如何使用mongodb
查询数据的示例(确保在运行脚本之前运行npm install mongodb
):
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/gtfs';
// Connect to the database.
MongoClient.connect(url, function(err, db) {
// If an error occurred during connect, exit the script by
// throwing an exception.
if (err) throw err;
// Get a reference to the collection.
var routes = db.collection('routes');
// Run a query against the `routes` collection.
var cursor = routes.find({ route_id : '6182' });
// Read all the results from the cursor and turn them into a JS array.
cursor.toArray(function(err, documents) {
if (err) throw err;
// Output the results as JSON.
console.log('%j', documents);
// Close the connection.
db.close();
});
});
插入文档is documented here。
几乎任何Node代码都要考虑的一件事是所有I / O操作(网络/数据库/文件系统/等)都是异步的,这意味着你传递了一个在I / O操作时调用的函数已完成(或发生错误)。
这些来电不会阻止;换句话说,您只是告诉Node安排I / O操作并在完成后回复您。但是,在您告诉Node执行操作的代码之后的任何代码都将立即执行,而不仅仅是在操作完成时执行。
这就是为什么上面的代码在函数中嵌套函数的原因。