持久化文档突然停止返回下一个标识符值(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)。

我的文档在属性中有 referenceManyreferenceOne,当我创建它的新实例时,填充字段并保留 - 开始时一切顺利。我可以创建一些几乎是空的文档,有或没有参考文档,而且效果很好。在某些时候,我试图在数据库中添加新项目并收到错误消息:

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 作为字母数字字符串。