我有Symfony 2.6应用程序并使用doctrine-odm-bundle 3.0.2(doctrine-odm:1.1.2,mongodb:1.4.0)。
我的文档在属性中有referenceMany
和referenceOne
,当我创建它的新实例时,填充字段并保持不变 - 它在开始时就可以了。我可以创建几个几乎空的文档,使用引用的文档或没有,它工作正常。在某些时候,我试图在数据库中添加新项目并收到错误:
E11000 duplicate key error collection: test.Product index: _id_ dup key: { : 0 }
消息很明确 - 我可以看到有一个文件被添加到集合中,id = 0,因此第二个文件不能 - >双重输入。但为什么它突然开始回归" 0"对于身份?即使我检查了doctrine_increment_ids
集合 - id的计数器正在递增。但是$product->getId()
成了" 0"坚持下去。
如果我删除数据库并从头开始 - 它可以工作,我仍然可以在集合中添加新产品。让我们说我成功创造了12个产品。创建第13个结果,在集合中保留id = 0的文档。第14次因重复错误而失败。
你能帮忙解决问题或提出一个想法吗?
P.S>我不考虑升级Symfony2(此时)既不作为doctrine-odm-bundle(它也取决于更新的Symfony2) - 迁移工作量非常高,我不确定它是否会解决这个问题。首先,我想找出根本原因。
// Document Product
/**
* @MongoDB\Document
* @MongoDB\HasLifecycleCallbacks
*/
class Product
{
/** @MongoDB\Id(strategy="ALNUM", type="int") */
protected $id;
/**
* @Gedmo\ReferenceOne(type="entity", class="Entity\User", inversedBy="products", identifier="userId")
*/
protected $user;
/**
* @MongoDB\Field(name="user_id", type="int")
*/
protected $userId;
/**
* @MongoDB\ReferenceMany(
* targetDocument="Picture",
* discriminatorMap={"file" = "File", "picture" = "Picture"},
* discriminatorField="discr",
* defaultDiscriminatorValue="picture"
* )
* @Assert\Valid
*/
protected $pictures;
...
}
// Entity User
/**
* User entity
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var ArrayCollection $textures
*
* @Gedmo\ReferenceMany(type="document", class="Document\Product", mappedBy="user")
*/
protected $products;
...
}
// Document Picture
/**
* @MongoDB\Document
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField("discr")
* @MongoDB\DiscriminatorMap({"file" = "File", "picture" = "Picture"})
* @MongoDB\DefaultDiscriminatorValue("picture")
* @MongoDB\HasLifecycleCallbacks
*/
class Picture
{
/**
*
* @MongoDB\Id(strategy="ALNUM", type="int")
*/
protected $id;
/**
* @MongoDB\ReferenceOne(targetDocument="Product")
*
* @var Product $product
*/
protected $product;
...
}
答案 0 :(得分:0)
文档阅读总是有帮助的(生成策略)。基本上,strategy="ALNUM"
和type="int"
不能一起使用:)
将策略更改为 INCREMENT ,如果您想在_id中使用整数,请删除 type =" int" 。 或者,您可以将键入更改为字符串,以继续将_id作为字母数字字符串。