Mongodb : 避免字段值重复
Mongodb : avoid field value duplication
我正在使用 symfony ODM,我有两个 tables,一个用于保存账单,另一个用于保存最后的账单号码。
Bills
id|bill_no |created_at
--|-------------------
1 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
2 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
3 |b2018/02|ISODate("2019-03-18T23:06:12.000+05:30")
Last_Bill
id|last_bill_no|key |last_updated_at
--|-------------------
1 |2 |BILL |ISODate("2019-03-18T23:06:12.000+05:30")
根据Last_Bill table我正在将bill_no存入账单table,如果我同时创建两个账单,那么账单号码重复,如何我可以避免这种重复吗?请帮我。我的代码如下
$dm = $this->get('doctrine_mongodb')->getManager();
$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);
$dm->flush();
在 Bills Document billNo 中定义为,
/**
* @MongoDB\Field(name="bill_no", type="string")
*/
protected $billNo;
您可以通过在 billNo 字段中添加 @MongoDB\Index(unique=true) 装饰器来解决这个问题。
在 Bills Document billNo 中将被定义为,
/**
* @MongoDB\Field(name="bill_no", type="string")
* @MongoDB\Index(unique=true)
*/
protected $billNo;
在你的控制器中,你应该使用 ensureIndexes() 函数来确保创建索引,你应该将你的代码包装在 try...catch 中,以避免在你保存两个具有相同 billNo 的实体时出现重复索引异常。
您的控制器将与此类似:
$dm = $this->get('doctrine_mongodb')->getManager();
$dm->getSchemaManager()->ensureIndexes();
$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);
try
{
$dm->flush();
} catch (\Exception $e) {
// write some code here based what you want.
}
我正在使用 symfony ODM,我有两个 tables,一个用于保存账单,另一个用于保存最后的账单号码。
Bills
id|bill_no |created_at
--|-------------------
1 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
2 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
3 |b2018/02|ISODate("2019-03-18T23:06:12.000+05:30")
Last_Bill
id|last_bill_no|key |last_updated_at
--|-------------------
1 |2 |BILL |ISODate("2019-03-18T23:06:12.000+05:30")
根据Last_Bill table我正在将bill_no存入账单table,如果我同时创建两个账单,那么账单号码重复,如何我可以避免这种重复吗?请帮我。我的代码如下
$dm = $this->get('doctrine_mongodb')->getManager();
$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);
$dm->flush();
在 Bills Document billNo 中定义为,
/**
* @MongoDB\Field(name="bill_no", type="string")
*/
protected $billNo;
您可以通过在 billNo 字段中添加 @MongoDB\Index(unique=true) 装饰器来解决这个问题。
在 Bills Document billNo 中将被定义为,
/**
* @MongoDB\Field(name="bill_no", type="string")
* @MongoDB\Index(unique=true)
*/
protected $billNo;
在你的控制器中,你应该使用 ensureIndexes() 函数来确保创建索引,你应该将你的代码包装在 try...catch 中,以避免在你保存两个具有相同 billNo 的实体时出现重复索引异常。
您的控制器将与此类似:
$dm = $this->get('doctrine_mongodb')->getManager();
$dm->getSchemaManager()->ensureIndexes();
$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);
try
{
$dm->flush();
} catch (\Exception $e) {
// write some code here based what you want.
}