2014-01-28 244 views
1

非常简单,没有任何类型的配置中检索数据),我使用命令use meteor切换到分贝流星随后进入一些基本数据,以测试:流星无法从MongoDB的

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中检索数据并显示到客户端控制台,我没有成功。

我错过了什么?

回答

0

仅在客户端定义集合是不够的。您的mongo数据库位于服务器上,您的客户端需要从某处获取数据。它不直接从mongodb(我认为)获得,而是通过与服务器上的集合同步来获取它。

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

Meteor.subscribe('testData', function() { 
    var document = Documents.find(); 
    console.log(document); 
}); 
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以隐藏该同步时间。在您的代码中,find将在客户端启动时立即执行,并且数据可能不会及时到达。

你将初始项目到数据库作品(你不需要use meteor的方式)的方法,但是蒙戈将默认使用ObjectId,而不是一个字符串作为_id的。有一些微妙的方式,这可能会在流星项目中令人讨厌,所以我的建议是尽可能让流星插入您的数据。下面是一些代码,这将确保testData收集了一些文件:

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

注意如果集合中有没有文件,这将只执行。如果你想清除集合,你可以通过mongo控制台来完成。或者,您可以删除整个数据库:

$ meteor reset