持久化文档突然停止返回下一个标识符值(ALBUM 策略)
Persisting a document suddenly stops returning next identifier value (ALNUM strategry)
我有 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,因此第二个不能去 -> 重复条目。但为什么它突然开始 return "0" for id?尽管如此,我检查了 doctrine_increment_ids
集合 - id 的计数器正在增加。但是$product->getId()
坚持后变成了“0”
如果我删除数据库并重新开始 - 它有效,我仍然可以在集合中添加新产品。假设我成功创建了 12 个产品。创建 13th 导致 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;
...
}
文档阅读总有帮助(生成策略)。基本上,strategy="ALNUM"
和 type="int"
不能在一起 :)
将 strategy 更改为 INCREMENT 并删除 type="int" 如果您想在你的 _id 中有整数。
或者您可以将 type 更改为 string 以继续将 _id 作为字母数字字符串。
我有 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,因此第二个不能去 -> 重复条目。但为什么它突然开始 return "0" for id?尽管如此,我检查了 doctrine_increment_ids
集合 - id 的计数器正在增加。但是$product->getId()
坚持后变成了“0”
如果我删除数据库并重新开始 - 它有效,我仍然可以在集合中添加新产品。假设我成功创建了 12 个产品。创建 13th 导致 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;
...
}
文档阅读总有帮助(生成策略)。基本上,strategy="ALNUM"
和 type="int"
不能在一起 :)
将 strategy 更改为 INCREMENT 并删除 type="int" 如果您想在你的 _id 中有整数。 或者您可以将 type 更改为 string 以继续将 _id 作为字母数字字符串。