【问题标题】:Meteor - collection.find() always returns all fieldsMeteor - collection.find() 总是返回所有字段
【发布时间】:2013-04-04 09:30:33
【问题描述】:

遇到这个(有点烦人的问题)我正在尝试查找集合中的所有记录,而不是显示(或显示)特定字段(分数)。这只是一个示例,并不反映我的实际代码,但问题总是可以重现的。我排除的字段非常大,我只是想生成一个可用记录的菜单。

类似的命令

    players.find({},{score:1})
    players.find({},{score:0})

始终返回每个字段,而不是触发 mongodb 中的排除/包含。我什么都不担心,因为模板可能可以控制将哪些数据呈现为 html?仍然感觉数据无论如何都传输到了客户端;并显示在控制台中。

【问题讨论】:

  • 您的语法是错误的,因为您认为 Mongo 语法将直接适用于 Meteor。

标签: node.js mongodb meteor


【解决方案1】:

你的语法有点不对,应该是

CollectionName.find({}, {fields: {'onlyThisField':1}});

CollectionName.find({}, {fields: {'everythingButThisField':0}});

您的模板确实可以控制显示哪些数据,但仍有许多字段限制有意义的场景 - 数据隐私或效率(所有记录的某些字段,“当前”记录的所有字段)是两个常见的

你没有提到它,但这通常是在发布函数中 - 请参阅http://docs.meteor.com/#meteor_publish - fields 修饰符在客户端上也可用,但它不限制发送到客户端的数据,只是发送到模板- 服务器端字段减少/选择有不同的好处

--

仔细检查您是否也删除了 autopublish 包,但是如果您有该包并编写自己的发布函数,您应该会看到一个警告,这是您最常使用 fields 的地方

【讨论】:

  • 那行不通..您没有理解我的意思,我如何构建 mongo 查询、包含一个字段或排除每个字段都没有关系;它总是返回相同的结果;每个字段。
  • 你在客户端代码上使用这个吗?它只适用于服务器。如果您可以将代码放上去,它会有所帮助,因为如果您已经解决了此答案中的所有问题,则很难重现它。
  • 客户端没有这样的东西吗?
  • 客户端您可以在车把模板动作/函数或事件中修改 mongo 结果集。 CollectionName.find().fetch().filter(function(array,index){return new_array;});
  • 注意:Minimongo 现在支持客户端使用fieldsdocs.meteor.com/#/full/find
【解决方案2】:

首先,如果你想控制Collection.find()中的一些字段,你可以试试这样:

CollectionName.find({}, {fields: {field:1}});

但它只在服务器上工作。

或者试试这个:

在服务器上:

Meteor.publish("myCollection", function () {
    return SvseTree.find({},{fields: {field:1}});
});

在客户端:

Meteor.subscribe("myCollection");

然后运行meteor remove autopublish

其次,如果要获取 Collection.find() 的数组,请尝试这样做: 集合.find().fetch();

【讨论】:

  • 那么,现在没有办法限制客户端的字段吗?
猜你喜欢
  • 2014-05-23
  • 2023-03-14
  • 2015-09-23
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多