通过 Meteor / Mongo 返回子文档数组

Posted

技术标签:

【中文标题】通过 Meteor / Mongo 返回子文档数组【英文标题】:Returning subdocument array through Meteor / Mongo 【发布时间】:2015-03-13 02:50:28 【问题描述】:

我在返回和显示要添加到子文档的标签时遇到了一点问题。我添加标签没有问题,但想在每个标签的项目上放置一个标签。我根本找不到可以帮助我返回子文档中数组中的项目的资源。我认为这是我卡住的所有帮手 - 基本上是语法正确的方式来编写“Items.(this._id).itemTags.find();” :)

哦,我已经删掉了很多 html 和 JS,但是,是的,其他一切都运行良好。集合是“Items”,子文档是“itemTags”,在插入期间用“itemTags: []”设置。在我的测试环境中,我可以添加“Cats”和“Dogs”作为标签,并可以通过“Items.find().fetch();”检查对象来验证它是否有效。但我正在努力展示它们。

HTML:

<template name="item">
  #each itemTags
    <span class="label label-default">itemTag</span>
  /each
</template>

JS:

Template.item.helpers(
   itemTags: function() 
    var currentUserId = Meteor.userId();
    return Items.find(); // yes, this line is completely wrong, but I'm lost hehe
  
);

Template.item.events(
  'submit .add-tag': function(event) 
    event.preventDefault();

    var itemTag = event.target.text.value;

    Items.update(this._id, $push: itemTags: itemTag);

    event.target.text.value = "";

    return false;
  
);

数据库架构(如我的插入命令所示):

var item = 
  itemText: $(e.target).find('[name=itemText]').val(),
  createdAt: new Date(),
  createdBy: currentUserId,
  hard: false,
  difficulty: 'easy',
  checked: false,
  itemTags: [],
;

item._id = Items.insert(item);

【问题讨论】:

你能提供一个项目的架构吗? 没问题 - 添加到原始帖子中。 另外,您是否在 itemTags 帮助器中尝试过 Items.find(); 以及引用 this 在您的模板中,例如 this.itemText,而不是 itemTag? 【参考方案1】:

您唯一的问题是尝试在相同的每个块中迭代游标和子数组。如果您将 items 模板和单独的 item 模板分开,您将得到您想要的结果。

为了简单起见,我将您的代码更改为如下所示:

这是你的主体:

<body>
    > items
</body>

<template name="items">
  #each items
    > item
  /each
</template>

<template name="item">
  <h2>itemText tags are:</h2>
  <ul>
  #each itemTags
    <li>this</li>
  /each
  </ul>
</template>

这是你的助手:

Template.items.helpers(
  items: function () 
    return Items.find();
  
)

假设一个项目文档看起来像:

 
  itemText: String,
  itemTags: Array

我在 Meteorpad 上创建了一个应用程序供你玩:

http://meteorpad.com/pad/BmRQ5fkwWEMBKszJW/SO-27951102

您可以进一步更改那里的代码并实时查看更改。它基本上是流星的 jsfiddle。

编辑: 受@chip-castle 评论的启发,您实际上可以使用带有嵌套each 块的单个模板:

<template name="items">
  #each items
    <h2>itemText tags are:</h2>
    <ul>
    #each itemTags
      <li>this</li>
    /each
    </ul>
  /each
</template>

但在必要时使用单独的模板在设计和处理事件方面更加灵活。

【讨论】:

哇——谢谢!原来不是模板助手写错了。它需要完全删除,因为我的项目模板上已经有一个模板助手来拉取退货。删除该助手并更改为 this 后,它可以完美运行。感谢所有帮助! 没问题,很高兴你成功了。理论上,您可以在页面上将数组打印为 itemTags 并在后台返回其 toString() 方法,因此值以逗号分隔。但是没有办法提供一个dom(如列表)或单独设置它们的样式,或事件等。无论如何,对整个项目进行良好的锁定! :)【参考方案2】:

您有发布和订阅设置吗?

server/publications.js

Items = new Mongo.Collection("items");

Meteor.publish("items", function () 
  return Items.find();
);

client/subscriptions.js

Items = new Mongo.Collection("items");

Meteor.subscribe("items");

【讨论】:

是的,我能够看到我的所有项目并使用它们的修改功能对其进行操作,但我根本无法让标签出现在它们上面。

以上是关于通过 Meteor / Mongo 返回子文档数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

Meteor mongo 更新嵌套数组

MongoDB:返回所有子文档的列表

如何将所有 Meteor Mongo 集合名称检索为 Javascript 数组?

Meteor/Mongodb - 数组、子文档和重叠订阅

MongoDB & Meteor - 推入嵌套数组的查询不起作用,没有抛出错误