我有以下Post和Tag模型。帖子有标签数组字段包含tagIds。
var telescopeId1 = Posts.insert({
title: 'What is/are the main type',
userId: sacha._id,
author: sacha.profile.name,
details: 'Can someone recommend...',
submitted: new Date(now - 9 * 3600 * 1000),
commentsCount: 1,
tags: [{tagId: valveTagId},{tagId: pumpTagId}]
});
var valveTagId = Tags.insert({
slug: 'valve-tags',
name: 'valve tags',
submitted: new Date(now - 7 * 3600 * 1000),
description: 'Valve tags help relay.'
});
var pumpTagId = Tags.insert({
slug: 'pump',
name: 'pump',
submitted: new Date(now - 7 * 3600 * 1000),
description: 'PUMP is..,'
});
在Meteor中,我试图使用以下函数检索给定帖子中引用的所有Tag文档:
tags: function() {
return Tags.find({_id: this.tags.tagId});
}
但我得到空标签数组对象作为回报,为什么?
答案 0 :(得分:3)
我将做一些假设:
valveTagId
和pumpTagId
提供了定义的值。this
帮助程序中的上下文(tags
)是一个帖子文档。<强>问题强>
助手正在尝试执行以下操作:
Tags.find({_id: [{tagId: valveTagId}, {tagId: pumpTagId}].tagId});
这没有任何意义,因为数组没有tagId
属性。
<强>溶液强>
正确的实现会在该列表中提取find
的所有ID和_id
标记。这应该有效:
tags: function() {
var tagIds = _.pluck(this.tags, 'tagId');
return Tags.find({_id: {$in: tagIds}});
}
改进的解决方案
标记ID以执行此连接的笨拙方式存储。而不是存储:
tags: [{tagId: valveTagId}, {tagId: pumpTagId}]
考虑存储像这样的ID数组:
tags: [valveTagId, pumpTagId]
现在帮助者可以写成:
tags: function() {
return Tags.find({_id: {$in: this.tags}});
}
答案 1 :(得分:2)
this.tags
将是一个数组。所以它没有tagId
属性。
这是您找到所有标签的方式:
var tagIds = _.pluck(this.tags, 'tagId');
return Tags.find({_id: {$in: tagIds}});