如何检索给定帖子中引用的所有Tag文档?

时间:2015-12-01 12:46:45

标签: mongodb meteor tags

我有以下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});
}

但我得到空标签数组对象作为回报,为什么?

2 个答案:

答案 0 :(得分:3)

我将做一些假设:

  1. 上述代码的执行顺序为valveTagIdpumpTagId提供了定义的值。
  2. this帮助程序中的上下文(tags)是一个帖子文档。
  3. <强>问题

    助手正在尝试执行以下操作:

    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}});