Meteor无法从MongoDB中检索数据

时间:2014-01-28 05:32:11

标签: node.js meteor

非常简单,没有任何配置 - >

在项目目录中,我输入了命令:

$ meteor mongo访问mongodb

从那里(mongo shell),我使用命令use meteor切换到db meteor,然后输入一些基本数据进行测试:

j = { name: "mongo" }
k = { x: 3 }

db.testData.insert(j)
db.testData.insert(k)

我检查并输入结果:db.testData.find()


这是我的流星代码,只要客户端需要mongodb访问:

if (Meteor.isClient) {
    Template.hello.greeting = function () {
        return "Welcome to test.";
    };

    Template.hello.events({
        'click input' : function () {
            // template data, if any, is available in 'this'
            if (typeof console !== 'undefined')
                console.log("You pressed the button");
        }
    });

    Documents = new Meteor.Collection('testData');

    var document = Documents.find();
    console.log(document);

    var documentCbResults = Documents.find(function(err, items) {
        console.log(err);
        console.log(items);
    });
}

检查浏览器并根据日志显示undefined。从mongodb检索数据并显示到客户端控制台时,我没有成功。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

对于这个答案,我将假设这是一个新创建的项目,autopublish仍然存在。

正如Christian指出的那样,您需要在客户端和服务器上定义Documents。您可以通过将集合定义放在文件顶部或不在serverclient目录中的其他文件中来轻松完成此操作。

打印前两个测试文档的示例如下所示:

Documents = new Meteor.Collection('testData');

if (Meteor.isClient) {
  Template.hello.greeting = function () {
    return "Welcome to apui.";
  };

  Template.hello.events({
    'click input' : function () {
      var documents = Documents.find().fetch();
      console.log(documents[0]);
      console.log(documents[1]);
    }
  });
}

请注意以下事项:

  • find函数返回cursor。在编写模板代码时,这通常是您想要的。但是,在这种情况下,我们需要直接访问文档来打印它们,所以我在光标上使用了fetch。有关详细信息,请参阅文档。
  • 首次启动客户端时,服务器将读取已定义集合的内容,并将所有文档(如果已启用autopublish)同步到客户端的本地minimongo数据库。我将find放在click事件中以隐藏同步时间。在您的代码中,find将在客户端启动的瞬间执行,并且数据可能无法及时到达。

您将初始项插入数据库的方法有效(顺便说一下,您不需要use meteor),但是mongo默认使用ObjectId而不是字符串作为{{ 1}}。在流星项目中有一些微妙的方法可能令人讨厌,所以我的建议是尽可能让流星插入你的数据。以下是一些代码,可确保_id集合包含一些文档:

testData

请注意,只有在集合中没有文档时才会执行此操作。如果您想要清除集合,可以通过mongo控制台进行清理。或者,您可以使用以下命令删除整个数据库:

if (Meteor.isServer) {
  Meteor.startup(function() {
    if (Documents.find().count() === 0) {
      console.log('inserting test data');
      Documents.insert({name: "mongo"});
      Documents.insert({x: 3});
    }
  });
}

答案 1 :(得分:0)

仅在客户端定义集合是不够的。你的mongo db存在于服务器上,你的客户端需要从某个地方获取数据。它不是直接来自mongodb(我认为),而是通过与服务器上的集合同步来获取它。

只需在客户端和服务器的联合范围中定义Documents集合即可。您可能还需要等待Documents的订阅完成才能预期内容。更安全的是:

Meteor.subscribe('testData', function() {
    var document = Documents.find();
    console.log(document);
});