在Meteor中建立两个集合之间关系的最简单方法?

在Meteor中建立两个集合之间关系的最简单方法?,meteor,Meteor,我是Meteor的新手,正在开发我的第一个应用程序。这是一款鸡尾酒配方应用程序,包含一系列饮料和配料 每种饮料可以有很多成分。对于饮料中的每种成分,都有一个数量(数字)和一个计量单位(字符串) 我隐约怀疑,对于这个用例,像publish with relations包这样的东西可能有些过分,但我不清楚创建和填充第三个集合的最佳方法,该集合将容纳饮料和配料之间的这种关系 以下是我的饮料系列: Drinks=newmongo.Collection('Drinks'); 饮料,允许({ 更新:函数(

我是Meteor的新手,正在开发我的第一个应用程序。这是一款鸡尾酒配方应用程序,包含一系列饮料和配料

每种饮料可以有很多成分。对于饮料中的每种成分,都有一个数量(数字)和一个计量单位(字符串)

我隐约怀疑,对于这个用例,像publish with relations包这样的东西可能有些过分,但我不清楚创建和填充第三个集合的最佳方法,该集合将容纳饮料和配料之间的这种关系

以下是我的饮料系列:

Drinks=newmongo.Collection('Drinks');
饮料,允许({
更新:函数(userId,drink){返回ownsDocument(userId,drink);},
删除:函数(userId,drink){返回ownsDocument(userId,drink);}
});
拒绝({
更新:函数(用户名、饮料、字段名){
//仅允许编辑以下字段:
返回(u.without(字段名,'drinkName','drinkElements')。长度>0);
}
});
流星法({
drinkInsert:函数(drinkAttributes){
检查(Meteor.userId(),字符串);
支票(饮品){
德林克纳姆:弦,
饮用成分:数组,
drinkDescription:String,
drinkInstructions:String
});
var错误=ValidatedLink(drinkAttributes);
if(errors.drinkName | | errors.drinkElements)
抛出新Meteor.Error('无效饮料',“您必须输入饮料名称和成分。”);
var drinkWithSameName=饮料.findOne({drinkName:drinkAttributes.drinkName});
if(drinkWithSameName){
返回{
饮酒者:没错,
_id:drinkWithSameName.\u id
}
}
var user=Meteor.user();
var DIWER=uu.extend(DRINKATTERATES{
userId:user.\u id,
作者:user.username,
提交日期:新日期(),
评论:0,
投票人:[],
投票:0
});
var drinkId=饮料。插入(饮料);
返回{
_身份证号码:drinkId
};
},
向上投票:函数(drinkId){
检查(this.userId,字符串);
检查(数据、字符串);
var impacted=Drinks.update({
_id:drinkId,
投票人:{$ne:this.userId}
}, {
$addToSet:{upvoctors:this.userId},
$inc:{票数:1}
});
如果(!受影响)
抛出新Meteor.Error('无效',“未计算选票”);
}
});
ValidatedLink=功能(饮料){
var错误={};
如果(!喝。喝我)
errors.drinkName=“请说出您的饮料名称。”;
如果(!喝。喝成分)
errors.drinkIngredients=“请添加一些配料。”;
如果(!drink.drinkDescription)
errors.drinkDescription=“请简要描述您的饮料。”;
如果(!饮料.饮料说明)
errors.drinkInstructions=“请提供混合此饮料的分步说明。”;
返回错误;

}
不幸的是,除非您做一些真正多余的事情,如将两个集合反规范化为一组文档,否则添加更多集合将无济于事。我的建议是选择所描述的路径之一

请注意,在您的例子中,您不能实际使用PWR,因为它不会通过数组进行反应性连接。我建议使用“加入客户”技术。这与我们目前在Edthena所遵循的模式相同——尽可能在服务器上使用PWR进行连接,但在存在阵列关系时在客户端(使用路由器)进行连接

有关更多详细信息,请参见以下相关问题: