非常简单,没有任何配置 - >
在项目目录中,我输入了命令:
$ 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检索数据并显示到客户端控制台时,我没有成功。
我错过了什么?
答案 0 :(得分:1)
对于这个答案,我将假设这是一个新创建的项目,autopublish
仍然存在。
正如Christian指出的那样,您需要在客户端和服务器上定义Documents
。您可以通过将集合定义放在文件顶部或不在server
或client
目录中的其他文件中来轻松完成此操作。
打印前两个测试文档的示例如下所示:
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);
});