【问题标题】:Meteor unable access Collection流星无法访问收藏
【发布时间】:2015-12-12 14:43:01
【问题描述】:

我正在完成我的第一个 Meteor 构建,我到达了某个点并撞到了墙上。我无法访问我的集合,起初我认为这是我的查询语法的问题,但我认为不是。

我尝试过:db.collection.find(),它在 Mongo shell 中按预期工作,但在客户端,db.collection.find() 返回LocalCollection.Cursor,它只是给了我与当前集合相关的函数和原型的列表。

db.collection.find().fetch() 只返回{}

更多信息:我已经安装了 admin-ui,并通过它设置了一个架构。当前用户是管理员,分配了管理员角色。

提前感谢您的帮助。我正在努力调试这个。

【问题讨论】:

  • 只是问,你有没有发布收藏并订阅它?
  • 据我了解,这可能会进一步做一些事情——默认情况下,meteor 没有设置为需要订阅,对吗?无论哪种方式,我都遵循这些步骤并确保该集合已发布和订阅。 ...与 db.find().fetch() 看起来仍然相同,并且我的查询返回相同的内容。
  • 您在代码中的某个位置定义了集合。像collection = new Mongo.Collection("collection"); 这样的东西。客户端和服务器都应该可以访问该集合。并省略db.,只写collection.find().fetch();。如果没有找到项目,它应该返回 [],一个空数组,而不是 {},它是一个没有属性的对象。
  • 如果您安装了自动发布包,您应该能够从客户端看到您的收藏,而无需发布/订阅。您可以查看文件.meteor/packages 以查看是否安装了自动发布。

标签: javascript mongodb meteor


【解决方案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!");
}

【讨论】:

  • 非常感谢您的帮助。出版绝对是问题所在。奇怪的是我知道数据在那里,然后我通过按日期选择找到它并且它停止在客户端上更新,但我还决定在我提交之前尝试使用前端的其他一些东西,所以也许添加/删除包删除自动发布或其他东西。
【解决方案2】:

Mongo 有一个专门用于 mongodb 操作的 API,它与 mongodb 自己的 API 略有不同。

在流星世界中,您首先“定义一个集合”(在服务器和客户端都以最基本的形式)

MyCollection = new Mongo.Collection('mycollection');

现在默认情况下,这会在名为“meteor”的数据库中结束,其中包含一个名为“mycollection”的集合

插入:

MyCollection.insert({foo: "bar"});

如果您没有从您的应用程序中删除“自动发布”包,则要查询它

MyCollection.find();

现在这会返回一个“光标”而不是数组,因此要将其映射到数组,您可以这样做

MyCollection.find().fetch();

而在 mongo shell 上,你会做到的

use meteor
db.mycollection.find()

【讨论】:

  • 非常感谢。我将米歇尔的答案标记为正确答案,因为我想。对我的问题的措辞方式最有帮助,但是您所说的很多内容在文档中并不是很清楚。事实上,关于 Meteor 和 Mongo 查询的文档非常薄。例如 $gte、$lt 和其他在 mongo 中工作的运算符,然后是那些不喜欢 $date 的运算符。
  • 嗯,是的,他们需要重新实现大部分 api,以便它也可以在浏览器中使用。有时你会自己弄清楚它们。欢迎来到流星世界:)
【解决方案3】:

所以稍微想了想,我意识到我应该解决我在我的东西上遇到的问题,也许我是个白痴,但我学到了很多:

  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 不起作用。

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2015-04-19
    相关资源
    最近更新 更多