如何返回集合中的一组对象,这些对象与Meteor中的.find()匹配另一个集合中的一组字段

时间:2015-02-02 18:32:26

标签: mongodb meteor

我一直在努力学习如何使用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'添加更多信息或将其用作数组)。我需要它来返回所有包含所选蔬菜的食谱。我一直在尝试许多不同的方法来解决问题,但没有任何工作......流星大师,请帮忙!

2 个答案:

答案 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数组中成分的相应食谱。