【问题标题】:Auto increment a property value in Strongloop loopback model在 Strongloop 环回模型中自动增加属性值
【发布时间】:2015-02-28 23:01:19
【问题描述】:

是否有一种内置方法可以自动增加模型的属性值是 Strongloop loopback ?该模型有一个名为 orderNumber 的属性,我希望它从 1 开始,并在每次创建新模型时递增 1。这个模型被持久化到一个 mongo DB。如果 Strongloop 环回没有内置方式,那么使用 javaScript、Node 和 mongoDB 的最佳实践是什么?

谢谢,

【问题讨论】:

标签: javascript mongodb rest loopbackjs strongloop


【解决方案1】:

好的,这个解决方案有效,但我绕过了 Loopback 和“mongoDB 连接器”。这就是我正在做的事情。

给定一个名为 Sequence 的模型,如下所示:

{
    "_id": {
        "$oid": "54ab3ec0cc074e24144f26d7"
    },
    "collection": "SpecialOrder",
    "value": 113
}

我正在这样做:

mongoConnector = app.dataSources.MyMongoDBConnectorName.connector;

mongoConnector.collection("Sequence").findAndModify({collection: 'SpecialOrder'}, [['_id','asc']], {$inc: { value: 1 }}, {new: true}, function(err, sequence) {
        if(err) {
            console.log(err.message);
        } else {
            // Do what I need to do with new incremented value sequence.value
        }
    });

似乎应该有一个内置的 LoopbackJS 方法来做到这一点。为了增加一个价值,需要经历很多事情。

谢谢,

沃伦·贝尔

【讨论】:

    【解决方案2】:

    有同样的问题,但使用 Postgres。修复了仅在数据库中手动使用更改列“id”(将类型设置为 SERIAL,这意味着 Postgres 中的自动增量)。我认为在任何数据库上都可以通过这种方式解决问题。

    【讨论】:

    • 除了 mongodb 之外的所有人......似乎还不能做到这一点
    【解决方案3】:

    我想分享我的方法,这与作者的答案相似,但使用的是 Loopback 的方法。 这是我创建的Sequence 模型:

    {
      "name": "sequence",
      "base": "PersistedModel",
      "idInjection": true,
      "options": {
        "validateUpsert": true
      },
      "properties": {
        "name": {
          "type": "string",
          "required": true
        },
        "value": {
          "type": "number",
          "required": true
        }
      },
      "validations": [],
      "relations": {},
      "acls": [],
      "methods": []
    }
    

    您可以在此模型中存储任意数量的序列。然后我用这个脚本创建一个我需要的序列(在本例中为order 序列):

    var app = require('./server/server');
    
    var Sequence = app.models.Sequence;
    
    Sequence.findOrCreate({
      where: {
        name: 'order'
      }
    }, {
      name: 'order',
      value: 0
    }, function (err) {
      if (err) {
        console.log(err);
      }
      process.exit();
    });
    

    现在每次我需要订单号来创建订单时,首先我通过增加 Sequence 模型中的 order 记录来更新其 value,然后使用它:

    var Sequence = Order.app.models.Sequence;
    
    Sequence.findOne({
      where: {
        name: 'order'
      }
    })
    .then(function (orderNumber) {
      orderNumber.value++;
      return orderNumber.save();
    })
    .then(function (orderNumber) {
      Order.upsert({
        orderNumber: orderNumber.value,
        ...
      });
    });
    

    干杯!

    【讨论】:

    • 我不确定这样做是否会导致并发请求出现 id 冲突。我相信增量必须发生在序列模型中,并且只在更新 db 中的值后返回
    • 似乎添加 { allowExtendedOperators: true } 可以为 mongodb 解决问题。见stackoverflow.com/questions/40108092/…
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2014-12-14
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多