通过 ids 在 2 mongodb collections 之间创建 many-to-many 关系
Creating a many-to-many relationship between 2 mongodb collections by ids
我有两个 collection。一个叫做 Posts,另一个叫做 Categories。在 posts collection 中,每个 posts 都包含一个名为 categories
的 id 数组,它们是个人 post 所属类别的 id存储在 post 中。
第二个 collection 是 类别 collection,其中包含每个 post 属于
的类别
目标
在我的模板中,我将每个 post 显示为其标题、内容、图像和作者以及通过将帖子 collection 中的类别 ID 链接到的类别名称类别 collection
中的各个类别
<template name="latest">
{{#each posts}}
<div>{{> category}}</div>
<h5 class="latest-title">{{title.rendered}}</h5>
<img class="latest-img" src="{{featured_image_thumbnail_url}}" alt="" />
{{/each}}
</template>
在我的类别模板中
<template name="category">
{{#each categories}}
{{name}}
{{/each}}
</template>
在我的category.js
Template.category.helpers({
categories(){
return CategoryCollection.find({ id: parseInt(this.categories) });
}
});
如您所见,我想显示属于 post 的类别的名称,它们在一个数组中,因为 post 可能也有 3 个属于它的类别。但我似乎无法让它工作。
编辑
这是我的编辑以包含 $in
Template.category.helpers({
categories(){
return CategoryCollection.find({ id: {$in: this.categories }});
}
});
这是我的模板
<template name="category">
{{#each categories}}
{{name}}
{{/each}}
</template>
好像没用。
进度
它没有工作,因为我没有为我的示例分配类别post,上面编辑的代码就是答案
您想使用 $in
运算符:
return CategoryCollection.find({ id: {$in: this.categories }});
我用于此类内容的另一种解决方案是只显示 post 数组中的类别,甚至没有助手。这就是我所做的...
方法内部:
//the categories is what you pass from the client as an array of strings
//IE: ['cat1', 'cat2']
categories.forEach(function(cc){
const cat = Categories.findOne({name: cc});
if(!cat){
Categories.insert({
name: cc,
count: 1
});
} else {
//increment count if it exists
Categories.update({name: cc}, {
$inc:{
count: 1
}
});
}
});
我插入计数 1 并在类别存在时增加计数的原因是针对多个不同的用例,例如:
在搜索时显示现有类别,以便始终 return 现有文档
如果edit/delete post,如果count == 1
,则删除该类别如果count > 1
,则该类别的计数减少。
当用户 adding/editing post 时显示现有类别的引用。根据他们在输入中写的内容,我 return 使用正则表达式的类别推荐。
在 post 中,仅显示 post 中的类别名称。无需查找类别。
<!--
see that its {{this}} not {{name}} because
we saved the categories to the post as an array of strings
we'd do {{name}} if we were looping through the categories collection
-->
{{#each categories}}
{{this}}
{{/each}}
如果您需要从 post 中的数据库访问类别,例如单击事件,您可以快速 Categories.findOne({name: this.name})
我看到你将其他东西保存到类别集合中,我可能会保存到 post 本身和一些,如果它们是,我什至不会保存和生成必要的东西客户端比如链接等
我有两个 collection。一个叫做 Posts,另一个叫做 Categories。在 posts collection 中,每个 posts 都包含一个名为 categories
的 id 数组,它们是个人 post 所属类别的 id存储在 post 中。
第二个 collection 是 类别 collection,其中包含每个 post 属于
的类别目标
在我的模板中,我将每个 post 显示为其标题、内容、图像和作者以及通过将帖子 collection 中的类别 ID 链接到的类别名称类别 collection
中的各个类别<template name="latest">
{{#each posts}}
<div>{{> category}}</div>
<h5 class="latest-title">{{title.rendered}}</h5>
<img class="latest-img" src="{{featured_image_thumbnail_url}}" alt="" />
{{/each}}
</template>
在我的类别模板中
<template name="category">
{{#each categories}}
{{name}}
{{/each}}
</template>
在我的category.js
Template.category.helpers({
categories(){
return CategoryCollection.find({ id: parseInt(this.categories) });
}
});
如您所见,我想显示属于 post 的类别的名称,它们在一个数组中,因为 post 可能也有 3 个属于它的类别。但我似乎无法让它工作。
编辑
这是我的编辑以包含 $in
Template.category.helpers({
categories(){
return CategoryCollection.find({ id: {$in: this.categories }});
}
});
这是我的模板
<template name="category">
{{#each categories}}
{{name}}
{{/each}}
</template>
好像没用。
进度
它没有工作,因为我没有为我的示例分配类别post,上面编辑的代码就是答案
您想使用 $in
运算符:
return CategoryCollection.find({ id: {$in: this.categories }});
我用于此类内容的另一种解决方案是只显示 post 数组中的类别,甚至没有助手。这就是我所做的...
方法内部:
//the categories is what you pass from the client as an array of strings
//IE: ['cat1', 'cat2']
categories.forEach(function(cc){
const cat = Categories.findOne({name: cc});
if(!cat){
Categories.insert({
name: cc,
count: 1
});
} else {
//increment count if it exists
Categories.update({name: cc}, {
$inc:{
count: 1
}
});
}
});
我插入计数 1 并在类别存在时增加计数的原因是针对多个不同的用例,例如:
在搜索时显示现有类别,以便始终 return 现有文档
如果edit/delete post,如果
count == 1
,则删除该类别如果count > 1
,则该类别的计数减少。当用户 adding/editing post 时显示现有类别的引用。根据他们在输入中写的内容,我 return 使用正则表达式的类别推荐。
在 post 中,仅显示 post 中的类别名称。无需查找类别。
<!--
see that its {{this}} not {{name}} because
we saved the categories to the post as an array of strings
we'd do {{name}} if we were looping through the categories collection
-->
{{#each categories}}
{{this}}
{{/each}}
如果您需要从 post 中的数据库访问类别,例如单击事件,您可以快速 Categories.findOne({name: this.name})
我看到你将其他东西保存到类别集合中,我可能会保存到 post 本身和一些,如果它们是,我什至不会保存和生成必要的东西客户端比如链接等