我一直在努力学习如何使用Meteor平台以及全新的平台。我发现我认为这个简单的任务似乎很难在流星平台上实现。我只是试图显示包含“已检查”成分的匹配字段的食谱。
我有两套收藏品: - 蔬菜包含'成分'作为字段,'检查'作为(布尔)字段。 - 食谱包含'成分'作为字段以及'描述'和'名称'
我正在尝试返回一个查找,其中显示了包含在Vegetables对象中检查的成分的所有食谱。
我发现的是我不能直接在.find中嵌入一个集合:错误说“过多的递归”。我想这只是:
Recipes.find(vegetables.find({'checked': true}, {fields: {_id: 0, ingredients: 1}}))
如果只是那么容易......我所做的就是在提交按钮事件中我做了以下事情:
Session.set('SelectedVeg', vegetables.find({'checked': true}, {fields: {_id: 0, ingredients: 1}}).fetch());
Session.set('count', vegetables.find({'checked': true}, {fields: {_id: 0, ingredients: 1}}).count());
然后在显示食谱的功能中:
'recipe': function () {
var length = Session.get('count');
FoundRecipes = Recipes.find(Session.get('SelectedVeg')[0]).fetch();
return FoundRecipes;
}
我发现我必须在Session.get('SelectedVeg')之后使用[0]才能获得任何结果。这有效,但它只搜索了第一个已经'检查'的对象:蔬菜集合中的true。我尝试了一个for循环,但没有运气(似乎无法向'FoundRecipes'添加更多信息或将其用作数组)。我需要它来返回所有包含所选蔬菜的食谱。我一直在尝试许多不同的方法来解决问题,但没有任何工作......流星大师,请帮忙!
答案 0 :(得分:0)
我认为这里的问题是selectedVeg
根据您提供的一些信息,我将假设vegetables.ingredients
字段是一个固定值(例如,不是数组)。如果ingredients
是一个数组,请告诉我,我会更新答案。
查询
vegetables.find({'checked': true}, {fields: {_id: 0, ingredients: 1}}).fetch();
将返回
[
{ingredients: a},
{ingredients: b},
{ingredients: c},
// ...
{ingredients: z}
]
因此,查询:
FoundRecipes = Recipes.find(Session.get('selectedVeg')[0]).fetch()
只会将{ingredients: a}
作为选择器 - 并且只返回有限的结果。
使用下划线更改selectedVeg
// get your data as normal
var selectedVeg = vegetables.find({
'checked': true
}, {
fields: {
ingredients: 1
}
});
// then convert [{ingredients: x}, ... ] -> [x, y, z]
selectedVeg = _.pluck(selectedVeg.fetch(), 'ingredients');
// set session value as normal
Session.set('selectedVeg', selectedVeg);
Session.set('count', selectedVeg.length);
然后,当您尝试查找配方时,请更改查询以使用$in
运算符
FoundRecipes = Recipes.find({
ingredients: {
$in: Session.get('selectedVeg')
}
}).fetch()
答案 1 :(得分:0)
在Nathan M的帮助下,我设法找到了问题的解决方案。我终于发现使用下划线的_.pluck命令解决了这个问题。
这里的提交按钮是代码:
Template.button.events({
"click .submit": function () {
Session.set('PossibleRecipes', true); //Sets to change helper to display possible recipes page.
selectedVeg = _.pluck(vegetables.find({'checked': true}).fetch(), 'ingredients');
Session.set('SelectedVeg', selectedVeg);
}
});
在可能食谱页面的助手中,我有以下内容:
Template.PosRec.helpers({
'visiblePR': function () {
if (Session.get('PossibleRecipes') == true) {
return "visible"
}
else return "hidden"
},
'recipe': function () {
FoundRecipes = Recipes.find({ingredients: {$in: Session.get('SelectedVeg')}}).fetch();
return FoundRecipes;
}
});
最后一步是直接使用蔬菜收集中的_.pluck而不是在会话上。这将返回已检查蔬菜的数组。然后使用帮助器'recipe'返回FoundRecipes,它找到具有SelectedVeg数组中成分的相应食谱。