0

我在 MongoDB 中有一个作为哈希类型的映射,名为“meta_info”,它只包含一些东西的键/值列表,我想将它变成 Symfony2 中可以动态增强(使用 js)的表单,拥有它看起来(基本上)像这样:

<input type="text" name="meta_info[key][]" /><input type="text" name="meta_info[field][]">   [- remove row]
<input type="text" name="meta_info[key][]" /><input type="text" name="meta_info[field][]">   [+ add row]

我的第一个想法是制作两个可以使用 js 复制的文本字段(键/值)(这不是问题),并在我的 Document 类的 setter 方法中转换为 json 字符串并转换回数组。但这似乎有点肮脏..

我也在考虑嵌入表单(现在在 sf2.1 中嵌入文档效果很好!) - 但我不知道如何为简单的键/值哈希实现这一点(它也应该像存储在 mongodb 中一样)

感谢您的任何想法和方法!

4

1 回答 1

1

从 Symfony 表单的角度考虑这一点,您可能希望拥有一个内部表单的动态集合,每个表单都有键和值输入字段。我想不出另一种实现来处理这种情况,因为您基本上通过使用哈希字段来超越任何模式的概念。这主要是这种情况与 ODM 中的嵌入式文档(具有映射)的区别,即使 MongoDB 将以相同的方式存储(嵌套对象)。

一种替代实现是拥有包含键和值属性的文档的 EmbedMany 关系。OpenSky 在内部使用它来表示产品属性。它在 MongoDB 文档中消耗了更多存储空间,因为您有一个带有keyvalue字段的对象数组,而不是键/值对的单个对象,但有一些明显的好处:

  • 可以映射结构,这与您现有的 ODM 模式很好地配合。
  • 因为每个键/值对都有一个模型,所以用 Symfony 形式来表示它更自然。
  • 也许最重要的是,如果您要按此数据进行查询,您可以利用多键索引来索引动态键和值,然后使用$elemMatch查询进行键/值查找。如果您只是使用带有动态键的哈希字段,则没有直接的方法来索引多个键(每个不同的字段路径都需要显式索引,或在复合索引中显式提及)。
于 2012-09-21T18:31:27.867 回答