Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Symfony 2.1中将MongoDB哈希类型作为增强键/值形式的原则_Php_Mongodb_Symfony_Symfony Forms_Symfony 2.1 - Fatal编程技术网

Php 在Symfony 2.1中将MongoDB哈希类型作为增强键/值形式的原则

Php 在Symfony 2.1中将MongoDB哈希类型作为增强键/值形式的原则,php,mongodb,symfony,symfony-forms,symfony-2.1,Php,Mongodb,Symfony,Symfony Forms,Symfony 2.1,我在MongoDB中有一个映射类型为hash,名为“meta_info”,它只保存某个东西的键/值列表,我想将其转换为Symfony2中的一个表单,可以动态增强(使用js),使其看起来(基本上)如下: <input type="text" name="meta_info[key][]" /><input type="text" name="meta_info[field][]"> [- remove row] <input type="text" name="m

我在MongoDB中有一个映射类型为hash,名为“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]
[-删除行]
[+添加行]
我的第一个想法是创建两个文本字段(key/value),它们可以使用js复制(这不是问题),并在Submit上转换为json字符串,然后转换回Document类的setter方法中的数组。。但这看起来有点脏

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


谢谢你的想法和方法

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

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

  • 可以映射该结构,这与您现有的ODM模式配合得很好
  • 因为每个键/值对都有一个模型,所以用Symfony表单表示更自然
  • 也许最重要的是,如果您要按此数据进行查询,您可以利用索引动态键和值,然后使用
    $elemMatch
    查询进行键/值查找。如果您只是使用具有动态键的散列字段,那么就没有直接的方法来索引多个键(每个不同的字段路径都需要显式索引,或者在复合索引中显式提及)

我也在考虑嵌入许多具有键/值属性的文档。。我会试试的,非常感谢