从流星集合中检索数据

时间:2012-12-18 20:17:46

标签: meteor

我在尝试从Meteor Collection获取数据时遇到一些问题,我需要一些建议。

已成功定义,发布和订阅该集合。如果我将数据发送到模板,它显示正常:

Template.Lists.Projects = function(){
    return Projects.find();
};

但我试图在显示之前使用数据,这就是我遇到问题的地方。首先,我在find()和findOne()之间遇到了一些不一致。 find(selector)工作正常并返回游标,但findOne(selector)返回“undefined”。我真的只想找一个条目,所以find()似乎没必要。

返回LocalCollection.Cursor:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
console.log(find);

返回undefined:

var find = Projects.findOne({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
console.log(find);

在LocalCollection.Cursor上使用.fetch()时出现了下一个问题。它返回一个空数组。

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
var fetch = find.fetch();
console.log(fetch);

所有这些返回的是以下行:

[]

当我尝试从我想要显示的数组中指定特定键时,例如:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
var fetch = find.fetch();
console.log(fetch.name);

返回undefined。

我仍然熟悉Meteor并且从未使用过MongoDB(或者还有Minorongo),所以我可能只是犯了一些愚蠢的错误。如果有人能指出我,我会很激动!

5 个答案:

答案 0 :(得分:4)

find()和findOne()的结果是一致的。基本上,Mongo或minimongo根本找不到与_id匹配的文档。 FindOne()就像在做一个find(选择器,选项).fetch()[0]。

您的Lists.Projects模板可能期望它可以迭代的集合,数组或散列。您无法返回一个特定文档。如果您正在使用{{#each Projects}},则必须为模板提供一些方法来迭代而不仅仅是单个值。

答案 1 :(得分:1)

我最近有同样的问题, 当从query.observe使用时,集合find()没有返回任何内容。

问题在于subscribe集合的顺序。

例如,如果您有一个名为Lists的集合和一个名为Projects的集合,

如果您通过观察列表上的查询来获取项目,那么您有:

Meteor.subscribe('Lists');
Meteor.subscribe('Projects');  

调用查询观察触发器会发生什么,但尚未从服务器获取项目。所以Projects.find()。fetch()。length = 0。

要修复它,只需执行

Meteor.subscribe('Projects');    
Meteor.subscribe('Lists');

答案 2 :(得分:0)

如果您已删除自动发布,如果您在不使用发布名称的情况下将该集合发布给所有用户该怎么办?

Meteor.publish null, ->
    Products.find {}

你订阅你的收藏?

模板助手

Handlebars.registerHelp = 'products', (id) ->
    Product.find _id: Session.get 'productId'
好像每个产品都有价格。 模板部分看起来像......

<template name="products-list">
    <div class="products-list">
        {{#each products}}
            {{> product-item}}
        {{/each}}
    </div>
</template>

<template name="product-item">
    <div class="product-item">
        {{price}}
    </div>
</template>

js部分,我将使用coffeescript ......

Template['product-item'].price = ->
    console.log @ # @ is this as it is product itself, if we have product inserted.
    console.log this
    return 'the price is: ' + @price

答案 3 :(得分:0)

试试这种方式

this._CountriesService.getCountries().subscribe(...)

答案 4 :(得分:0)

您正在使用客户端,而您永远不知道客户端何时获得所需的所有数据。当集合为空或仍未完成同步时,可以触发您的函数。因此,您必须向minimongo发出延迟请求(当所有数据都在本地可用时)

是的,当你没有通过getElementById()或者其他东西在DOM中呈现东西时,你无法访问它们,但在你的情况下,你试图从minimongo(浏览器中的本地mongodb版本)访问数据而不是DOM所以你的模板在这里并不重要。

等到您的订阅准备好后,您的minimongo会在您的订阅电话中拥有onReady回调的所有数据并启动您的功能。

https://docs.meteor.com/api/pubsub.html#Meteor-subscribe

  

回调(功能或对象)。

     

可选。可能包括 onStop onReady   回调。如果有错误,则将其作为参数传递给   的onStop。如果传递函数而不是对象,则为   解释为onReady回调。

相关问题