10

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

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

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

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

返回 LocalCollection.Cursor:

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

返回未定义:

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);

它返回未定义。

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

4

5 回答 5

4

您对 find() 和 findOne() 的结果是一致的。基本上,Mongo 或 minimongo 根本找不到与该 _id 匹配的文档。FindOne() 与 find(selector, options).fetch()[0] 完全一样。

您的 Lists.Projects 模板可能需要一个可以迭代的集合、数组或哈希。您不能退回一份特定的文件。如果您使用的是 {{#each Projects}},则必须为模板提供某种方式来迭代而不仅仅是单个值。

于 2012-12-21T09:19:52.073 回答
1

我最近遇到了同样的问题,集合 find() 从query.observe.

问题是subscribe集合的顺序。

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

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

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

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

要修复它,只需执行

Meteor.subscribe('Projects');    
Meteor.subscribe('Lists');
于 2013-06-26T23:37:59.300 回答
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
于 2012-12-18T22:37:08.107 回答
0

试试这个方法

Meteor.subscribe('testData', function() {
  var document = Documents.find();
  console.log(document); 
});
于 2017-04-22T09:29:48.157 回答
0

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

是的,当它没有通过或其他方式在 DOM 中呈现时,您无法访问内容,getElementById()但在您的情况下,您尝试从 minimongo(浏览器中的本地 mongodb 版本)而不是 DOM 访问数据,因此您的模板在这里并不重要。

只需等到您的订阅准备就绪,您的 minimongo 就会onReady在订阅调用中通过回调拥有所有数据并触发您的函数。

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

回调(函数或对象)。

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

于 2017-04-24T10:23:39.070 回答