为啥我的数据库对象的集合是空的?

Posted

技术标签:

【中文标题】为啥我的数据库对象的集合是空的?【英文标题】:Why is the collections empty of my database object?为什么我的数据库对象的集合是空的? 【发布时间】:2016-02-13 23:01:00 【问题描述】:

第 3 方节点模块,在 localhost 上创建和填充 mongoDB 数据库。我正在尝试使用数据库并从我的自定义模块中检索数据。即使我可以成功连接到数据库,它也没有显示数据库中的集合或文档。

我对 Mongoose 文档的印象,首先我必须创建模式,然后为我想要使用的每个集合创建 mongoDB 模型。这些模型是在第 3 方模块中创建的,并且我想使用的集合已经存在于数据库中。

如您所知,我是这个 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 对象时,它显示集合属性为空:

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  

【问题讨论】:

您是打算只查询数据库中的数据,还是专门使用像 Mongoose 这样的对象建模库? 首先查询数据,然后创建一个新的集合并插入带有查询结果的文档。我正在使用 Mongoose,因为我使用的第 3 方也在使用 Mongoose。它只是给了我一个起点。而且我不知道如何在 javascript 文件中运行 mongo 命令。 【参考方案1】:

在我看来,使用 mongodb 驱动程序而不是 Mongoose 可能更容易(后者在 MongoDB 文档之上实现了一个额外的层,这很好,但当数据库由 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 执行操作的代码后面的任何代码都将在之后立即执行,而不仅仅是在操作完成时执行。

这就是上面的代码将函数嵌套在函数中的原因。

【讨论】:

罗伯特,非常感谢。我实际上尝试与 MongoClient 连接,并且在 cursor.toArray(..) 之前我有相同的代码。我打印出游标对象——我称​​之为路由。它显示连接:空,服务器:空。我以为它不起作用。我打算将其作为我尝试的第二种方式分享,但帖子太长了。我绝对不喜欢猫鼬带来的额外层。再次感谢!

以上是关于为啥我的数据库对象的集合是空的?的主要内容,如果未能解决你的问题,请参考以下文章

将 json 数据转换为 [[String: AnyObject]] 后,它似乎是空的 - 为啥?

为啥我的 $_ENV 是空的?

为啥我的 Eclipse 工作区是空的?

为啥我的相机胶卷模式是空的?

为啥我的 PATCH 请求的响应是空的? (Javascript)

为啥我的 CSRF 令牌在使用 Form::open() 时是空的?