保持文件突然停止返回下一个标识符值(ALNUM策略)

时间:2017-01-20 19:30:22

标签: mongodb symfony doctrine-orm doctrine-odm odm

我有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,因此第二个文件不能 - >双重输入。但为什么它突然开始回归" 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;
    ...
 }

1 个答案:

答案 0 :(得分:0)

文档阅读总是有帮助的(生成策略)。基本上,strategy="ALNUM"type="int"不能一起使用:)

策略更改为 INCREMENT ,如果您想在_id中使用整数,请删除 type =" int" 。 或者,您可以将键入更改为字符串,以继续将_id作为字母数字字符串。