在集合中生成自动增量order_id

时间:2019-07-08 21:36:23

标签: mongodb

所以我有如下的商店集合:


     { 
         "_id" : ObjectId("5cd4c45492e22458d9570841"), 
         "store_id" : ObjectId("5cd4c45492e22458d9570840"), 
         "create_dt" : ISODate("2019-05-10T00:22:44.000+0000"), 
         "update_dt" : ISODate("2019-06-03T19:35:00.000+0000"), 
         "order_id_counter" : NumberInt(1001)
     }

每个商店都有一条包含唯一store_id的记录,我需要构建一个函数getOrderId(store_id)来自动返回生成的易于记忆的唯一order_id,每次调用该函数时,每次调用都会自动将order_id_counter值增加该商店的记录为1(每个商店都有自己的order_id_counter,每个商店的值都不同)。我也希望操作是原子的。

如何为以上功能编写代码?最有效的方法是什么?

2 个答案:

答案 0 :(得分:0)

在mongo中生成唯一的递增编号的一种方法是,使用{store_id, current_count}创建一个单独的集合,并使用带有findAndModify的{​​{1}}操作来增加计数器并返回文档。在这种情况下,无法保证一旦生成一个数字便会成功创建相应的订单,因此您最终可能会出现空白。

另一种方法是在组合$inc上创建唯一索引,有时插入新订单会失败,需要重试。

答案 1 :(得分:-1)

<policies>
    <inbound>
        <set-backend-service id="apim-generated-policy" backend-id="preaddresscode2" />
        <rewrite-uri template="/HttpTrigger1" />
        <set-variable name="isAuthOk" value="@{
    string[] value;
  if (context.Request.Headers.TryGetValue("Authorization", out value))
  {
    BasicAuthCredentials credit = context.Request.Headers.GetValueOrDefault("Authorization","").AsBasic();
    if(credit == null){
        return false;
    }
    switch(credit.UserId){
        case "UUUUUU1":
            // it seems an ugly implementation.
            if(credit.Password.Equals("PPPPPP1")){
                return true;
            }
        case "UUUUUU2":
            if(credit.Password.Equals("PPPPPP2")){
                return true;
            }
        break;
            default:
        break;        
    }
    return false;
  }
  else
  {
    return false;
  }
  return true;
        }" />
        <base />
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<bool>("isAuthOk"))" />
            <otherwise>
                <return-response>
                    <set-status code="401" reason="Unauthorized" />
                    <set-header name="WWW-Authenticate" exists-action="override">
                        <value>Basic realm="someRealm"</value>
                    </set-header>
                    <set-body>Wrong username or password</set-body>
                </return-response>
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>