Meteor无法访问集合。

3
我正在进行我的第一个Meteor构建,但在某个关键点上遇到了问题。我无法访问我的collections。起初我以为是查询语法的问题,但现在不再认为是这个问题了。
我已经尝试过:db.collection.find()并且在Mongo shell中它的效果正常,但在客户端中,db.collection.find()返回LocalCollection.Cursor,只提供当前collection相关函数和原型的列表。
db.collection.find().fetch()只返回{}。
进一步的信息:我安装了admin-ui,并通过它设置了一个schema。当前用户是管理员,分配了管理员角色。
非常感谢您的帮助。我快要被调试搞崩了。

1
只是问一下,你是否已经发布了这个集合并订阅了它? - piscator
据我理解,这可能是稍后完成的事情 - 默认情况下,Meteor不需要订阅,对吗?无论如何,我按照步骤操作,并确保集合已发布和订阅。...仍然使用db.find().fetch()看起来一样,我的查询返回相同的结果。 - AdamBlonsky
在你的代码中某处定义了集合,类似于 collection = new Mongo.Collection("collection");。该集合应该可以被客户端和服务器访问。不要写 db.,只需写 collection.find().fetch();。如果没有找到任何项,则应返回一个空数组 [],而不是没有属性的对象 {}。 - Jos Harink
如果您已安装autopublish软件包,则应能够在客户端上看到您的集合,无需发布/订阅。 您可以查看文件.meteor/packages以查看是否已安装autopublish。 - Jos Harink
3个回答

1

一份针对“我在Meteor中看不到我的数据”问题的清单:

  1. $ meteor add autopublish
  2. 现在您是否能看到您的数据了?

类型:

console.log('My subscription has '+myCollection.find().count()+' documents!");

在您的浏览器控制台中查看。

  1. 如果是,则您尚未正确发布和订阅您的集合:

服务器:

Meteor.publish('myPublication',function(){
  return myCollection.find(); // or whatever subset you want for this user
});

客户端:

var handle = Meteor.subscribe('myPublication');
  1. $ meteor remove autopublish
  2. 现在您能看到数据了吗?
  3. 是的-问题已解决
  4. 否则,您是否检查得太早了?您可能需要等待订阅准备就绪。这通常在路由器中完成,但也可以通过检查订阅处理程序的ready()状态来完成。

代码:

if ( handle.ready() ) {
  console.log('My subscription has '+myCollection.find().count()+' documents!");
}

非常感谢您的帮助。发表肯定是问题所在。奇怪的是,我知道数据是存在的,然后我通过按日期选择来查找它,但客户端停止更新了,但在提交之前我还决定尝试一些其他的前端操作,所以可能添加/删除包移除了自动发布或其他东西。 - AdamBlonsky

0
Mongo有一个专门的API用于mongodb操作,它与mongodb自己的API略有不同。
在Meteor世界中,您首先需要“定义一个集合”(在最基本的形式上,在服务器和客户端都要定义)。
MyCollection = new Mongo.Collection('mycollection');

现在默认情况下,这将以名为“meteor”的数据库和名为“mycollection”的集合的形式结束。
要插入它:
MyCollection.insert({foo: "bar"});

要查询此事,需要确认您的应用中是否已移除了"autopublish"包

MyCollection.find();

现在这返回的是一个“游标”,而不是一个数组,所以要将其映射到一个数组,你需要:
MyCollection.find().fetch();

而在Mongo Shell上,你会做:

use meteor
db.mycollection.find()

非常感谢。我标记了Michel的答案,因为我认为它对我的问题措辞方式最有帮助,但是你说的很多内容从文档上来看并不是很清晰。事实上,当涉及到Meteor和Mongo查询时,文档相当薄弱。例如$gte、$lt和其他在Mongo中有效的运算符,以及像$date这样无效的运算符。 - AdamBlonsky
是的,他们需要重新实现大部分API,以便在浏览器中使用。有时候你需要自己去解决问题。欢迎来到Meteor世界 :) - Serkan Durusoy

0

经过一番思考,我意识到应该详细介绍一下我遇到的问题,也许我很蠢,但我学到了很多:

  1. 我的集合没有发布。
  2. 我的语法不正确,很难在原型之间来回测试以使其正常工作。

这是我的助手代码:

myFunction: function () {

    // get from array the date we need and its ISOdate

    selector = Session.get("myCalendarArray");
    today = selector.month[dayPointer];
    today = today["ISOdate"];

    //  set the date for tomorrow, in this case the dates are set at 12:00AM,
    //  so we actually only need half way through the day.

    tomorrow = new Date();
    tomorrow = tomorrow.setDate(today.getDate() + .5);


    return MyCollection.find( { releaseDate : { $gte : new Date(today), $lte : new Date(tomorrow) } }  ).fetch()

    }

所以我最终让它工作的问题是:

  1. "releaseDate"指针需要裸露,不能像在shell等中加引号。
  2. new Date(today) 是从数据库选择日期的正确方式,$date 不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接