在Strongloop环回模型中自动增加属性值

时间:2015-01-02 16:19:33

标签: javascript mongodb rest loopbackjs strongloop

是否存在自动递增模型属性值的内置方法是Strongloop loopback?这个模型有一个名为orderNumber的属性,我希望它从1开始,每次创建一个新模型时递增1。此模型将持久保存到mongo DB。如果Strongloop loopback没有内置方式,那么使用javaScript,Node和mongoDB会被认为是最佳实践吗?

谢谢,

3 个答案:

答案 0 :(得分:3)

好的,这个解决方案有效,但我绕过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方式来做到这一点。要增加一个值,需要做很多事情。

谢谢,

沃伦贝尔

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我想分享我的方法,这与作者的答案类似,但使用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();
});

现在,每当我需要订单号来创建订单时,首先我会通过递增order来更新Sequence模型中的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,
    ...
  });
});

干杯!