gpt4 book ai didi

javascript - 以复杂的方式在 3 个集合之间创建多对多关系

转载 作者:行者123 更新时间:2023-12-03 04:11:07 24 4
gpt4 key购买 nike

我有 3 个集合,meteor.user()CategoriesPosts

用户可以通过将类别的 id 保存在 meteor.user() 的数组中来选择关注任何类别的帖子

这样做的最终目标是用户拥有一个个人信息流,其中显示他们所关注的类别中的帖子。

帖子集合中的每个帖子都包含一个其所在类别的数组。

enter image description here

每个类别都有一个帖子数组,数组中的每个帖子都有一个帖子的ID字段。

enter image description here

其中 id: 67 是类别的 ID,posts.ID: 74 是类别中帖子的 ID。

下面是帖子集合中帖子的 ID,与类别集合中的 posts.ID 相匹配

enter image description here

用户保存类别 ID,因此它在meteor.user() 中显示为类别数组

enter image description here

当我这样做时

Template.userTimeline.helpers({
category: function() {
var posts = Category.find({
id: {
$in: Meteor.user().category
}
});
return posts
console.log(posts);
}
});

我能做到

 {{#each category}}
<ul class="article-timeline">
{{#each posts}} {{ID}} {{/each}}
</ul>
{{/each}}

但这让我可以访问类别集合中的 posts.ID 并显示它。

问题

如何进一步将通过上述代码获得的 posts.ID 与 Post 中的帖子 id 相匹配,以便我可以从 Posts< 访问帖子 集合。我可以做这样的事情吗?

Template.userTimeline.helpers({
category: function() {
var postsInCategory = Category.find({
id: {
$in: Meteor.user().category
}
});

var postMatch = Post.find({
ID: {
$in: postsInCategory
}
});
return postMatch
console.log(postMatch);
}
});

ZIM 答复后进一步编辑

因此,您给我的解决方案是从我的Categories集合中包含的帖子对象中获取post.title,如下所示。

enter image description here

类别集合中的这个post数组不完整,它是原始帖子集合的副本

我需要做的是使用post.ID,如上图所示。即类别集合中的帖子数组,用于与原始Posts集合中帖子的id创建多对多关系,因此,我需要如下的 title.rendered 而不是 post.title

帖子收藏。

enter image description here

如果您看到 Category 集合中 post 数组中的 ID(不是顶部 id,它是类别的 id),post.IDIDENTICALPosts 集合中帖子的 id。这是这一切的关键,帮助我创建一个关系,这样,就不会显示帖子数组中的titlepost.title Categories 集合,我需要在原始 Posts 集合中显示 title.rendered

最佳答案

听起来您无法控制数据格式,因此您必须使用嵌套循环来处理您拥有的格式。我认为以下应该有效。

Template.userTimeline.helpers({
categories: function() {
return Category.find({
id: {
$in: Meteor.user().category
}
});
}
});

请注意,我更改了你的助手的名字。

{{#each category in categories}}
{{category.description}}
{{#each post in category.posts}}
{{post.title}}
{{/each}}
{{/each}}

参见http://blazejs.org/guide/spacebars.html#Each-in

编辑:

理想情况下,您可以使用 https://atmospherejs.com/reywood/publish-composite 之类的包进行服务器端连接

但由于您无法控制它,因此您可以进行客户端连接。您可以在模板的 onCreated() 中执行此操作(警告:这未经测试!)

this.subscribe('posts', function() {
let cursor = Categories.find({id: {$in: Meteor.user().category}});

cursor.observe({
added: function(newDocument) {
let category = newDocument;

// for this category, get all the associated post ids
let postIds = _.map(category.posts, function(p)) {
return p.ID;
};

// get the posts. we can fetch these because we waited for the publish of the posts collection.
let actualPosts = Posts.find({id: {$in: postIds}}).fetch();

// attach the actual posts to the category
category.actualPosts = actualPosts;
},
changed: function(newDocument, oldDocument) {
// if wanting to track changes to the categories, similar to added block
}
});
});

然后通过对模板进行简单的更改,您就可以获取这些实际的帖子:

{{#each category in categories}}
{{category.description}}
{{#each post in category.actualPosts}}
{{post.title}}
{{/each}}
{{/each}}

进行客户端连接有点棘手,因为正如上面所写,您缺少对用户跟踪的类别以及现有类别中的帖子的 react 。所以你可以进一步将所有这些放入自动运行中。它将跟踪 Meteor.user().category 的更改,但不确定是否会跟踪类别中的帖子更改。但这应该能让你取得很大的进展。

编辑2:

哦,是的,如果你这样做,当模板消失时,监听器将保持事件状态,除非你对其调用 stop() 。所以...

Template.userTimeline.onDestroyed(function() {
let handle = this.observeHandle.get();

if (handle) {
handle.stop();
}
});

Template.userTimeline.onCreated(function() {
let self = this;
self.observeHandle = new ReactiveVar();

self.subscribe('posts', function() {
let cursor = Categories.find({id: {$in: Meteor.user().category}});

let handle = cursor.observe({
added: function(newDocument) {
let category = newDocument;

// for this category, get all the associated post ids
let postIds = _.map(category.posts, function(p)) {
return p.ID;
};

// get the posts
let actualPosts = Posts.find({id: {$in: postIds}}).fetch();

// attach the actual posts to the category
category.actualPosts = actualPosts;
},
changed: function(newDocument, oldDocument) {
// if wanting to track changes, similar to added block
}
});

self.observeHandle.set(handle);
});
});

关于javascript - 以复杂的方式在 3 个集合之间创建多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44329030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com