我有一组甲板,每个甲板都有许多卡片。 字段“cards”是一个数组,其中包含卡片中ID的ID。
问题是,我有一张卡片列表,用户可以从中选择要添加到卡片组的卡片。当用户选择要添加到Decks集合中的卡片阵列的卡片时,Deps会抛出一个异常,说“不能在同一分支中创建第二个地标”,除非我不使用部分渲染列表,这是一个问题。我,因为每张卡都有自己的活动。虽然我刷新页面时数据已正确添加到卡组中,但更新显示。
Decks.js
Template.deckList.deck = () ->
Decks.findOne(_id: Session.get "deck").cards
甲板-list.html
<template name="deckList">
<section class="deck-list"><h1>deck</h1>
<ul class="cards">
{{#each deck}}
{{> cardInList}}
{{/each}}
</ul></section>
</template>
现在我想要制作一个单独的集合来保存两个ID(卡片和卡片组),但这可能不适用于具有相同问题的未来集合(例如在游戏集合中的手)
谢谢!
答案 0 :(得分:2)
你走在正确的轨道上,但如果我理解你的话,你的设计就会很糟糕。每次添加/删除卡时,您都不希望更新套牌文档中的数组。您可以更轻松地省略卡片文档中的cards
字段,而是在卡片文档中添加deckId
字段。虽然MongoDB经常鼓励嵌套/嵌入字段,但Meteor Collections通常在典型的关系数据库样式模式下工作得更好。看看你解决问题的方法:
<强> Decks.js 强>
Template.deckList.deck = () ->
Decks.findOne( _id: Session.get "deck" )
Template.deckList.cards = () ->
Cards.find( deckId: Session.get "deck" )
<强>甲板-list.html 强>
<template name="deckList">
<section class="deck-list">
<h1>{{#with deck}} {{title}} {{/with}} Deck</h1>
<ul class="cards">
{{#each cards}}
{{> card }}
{{/each}}
</ul>
</section>
</template>
<template name="card">
<li>{{foobar}}</li>
</template>
使用这种方法,您只需在卡片中添加/删除卡片,即可实时自动反映更改,而无需更新其他数据库集合中的其他文档。
编辑:如果你想要一个多对多的集合而不是一对多的集合,你可以修改服务器上的发布方法以返回特定套牌的卡片,并避免发布该连接的需要表到客户端。它可能看起来像:
// Server publish method
// Return just cards that are in deck "deckId"
Meteor.publish('cards', function (deckId) {
var cardIds = CardsDecks.find({ deckId: deckId }).map(function (connector) {
return connector.cardId;
});
return Cards.find({ _id: {$in: cardIds } });
});
// Client subscribe method
Meteor.subscribe('cards', Session.get('currentDeckId')); // Get just the cards related to the current deck
干杯!
注意:这最初是在CodersClan
上回答的