【问题标题】:Mongodb : avoid field value duplicationMongodb:避免字段值重复
【发布时间】:2019-10-06 11:38:58
【问题描述】:

我正在使用 symfony ODM,我有两张表,一张用于保存账单,另一张用于保存最后一张账单号。

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 表,我将 bill_no 保存到 bills 表中,如果我同时创建两个账单,则会发生账单编号重复,我该如何避免这种重复呢?请帮我。我的代码如下所示

$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;

【问题讨论】:

  • 你能不能在开始制作第二张账单之前坚持你的第一张账单?如果你之前坚持第一个,那么你应该得到正确的 lastBill
  • 我不能,因为账单创建是由一台服务器的两个客户端完成的。

标签: php mongodb symfony symfony4 odm


【解决方案1】:

您可以通过将 @MongoDB\Index(unique=true) 装饰器添加到 billNo 字段来解决此问题。

在 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.
}

【讨论】:

  • 让我试试这个
  • 请不要确保控制器中的索引,它会像你预期的那样变慢。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2021-05-15
  • 2020-09-23
相关资源
最近更新 更多