使用Doctrine和MongoDB存储阵列

使用Doctrine和MongoDB存储阵列,mongodb,symfony,doctrine,Mongodb,Symfony,Doctrine,如何使用Doctrine和Mongo DB存储阵列 我不想要参考文档,只想要数组 例如: Type[ Type1, Type2, Type3 ] 我是否需要创建新的Doctrine ODM数据类型 如果需要在数组中存储未映射到文档类的值,可以使用映射到MongoDB中基本数组的集合字段映射。还有一个hash类型,它类似地将PHP中的关联数组转换为MongoDB中的对象,而不映射其中的任何内容 如果示例中的“Type”是一个映射文档类,那么您需要使用一个关系,该关

如何使用Doctrine和Mongo DB存储阵列

我不想要参考文档,只想要数组

例如:

Type[ 
     Type1,
     Type2,
     Type3
]

我是否需要创建新的Doctrine ODM数据类型

如果需要在数组中存储未映射到文档类的值,可以使用映射到MongoDB中基本数组的
集合
字段映射。还有一个
hash
类型,它类似地将PHP中的关联数组转换为MongoDB中的对象,而不映射其中的任何内容

如果示例中的“Type”是一个映射文档类,那么您需要使用一个关系,该关系将在父文档中的数组中存储一个或多个映射文档。在MongoDB中,这将被表示为一个对象数组,这类似于您可以自己使用
集合
字段(存储一个关联数组)所做的事情;然而,ODM将利用EmbedMany映射将这些对象水合回文档实例

...
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
...
class MyClass
{
    /**
     * @MongoDB\Hash
     */
    protected $tags = array();
}

此外,如果您想要一个表单类型来帮助您处理该类型的变量,您可以检查它。

您可以根据需要使用mongo类型哈希或集合

散列:将值存储并检索为关联数组

集合:将值存储并检索为数字索引数组

例如:

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

class Category
{
    /**
     * @MongoDB\Field(name="tags", type="collection")
     */
    private $tags;

    /**
     * @MongoDB\Field(name="country_wise_total_count", type="hash")
     */
    private $country_wise_total_count;
}
数据的存储方式如下:

"tags": [
    "man",
    "boy",
    "male",
    "sandal",
    "cloth",
    "army boots",
    "boots",
    "sport shoes",
    "school",
    "casual",
    "office"
  ],

"country_wise_total_count": {
     "NP": NumberInt(7),
     "US" : NumberInt(10)
  }

为我工作,谢谢。不清楚为什么文档中没有指定,我们应该使用什么样的映射来更新数组以添加另一个key:value元素?@Sekai:我不理解这个问题。
collection
类型在将PHP值写入MongoDB字段(以数字方式重新索引键)之前,通过
array_values()
运行PHP值。
hash
策略将PHP值强制转换为对象(即PHP中的stdClass),以确保将其保存为BSON对象。集合/散列值中的键/值对均未映射(这就是它们与嵌入文档(EmbedOne和EmbedMany)的区别所在)。我的意思是,如果你有一个像0=>'a',1=>'b'这样的数组,我想附加'c',所以数组看起来像symfony2中的0=>'a',1=>'b',2=>'c',我会手动在我的文档类中添加一个函数来完成它。我想知道如果你的模型中有一个方法将元素附加到数组中,是否有一个映射会自动生成这个函数字段,它被映射为
集合
,行为应该是您所期望的。ODM不关心
散列
集合
的数组/对象值内的更改,所以它只是将
$设置
文档中的新值。这与引用相反,并且嵌入了许多关系,而在此之前,它有更多的逻辑来更新单个数组/对象元素。