所以我有如下的商店集合:
{ "_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,每个商店的值都不同)。我也希望操作是原子的。
如何为以上功能编写代码?最有效的方法是什么?
答案 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>