updateAll loopback datasource不会删除更新数据中的删除

时间:2016-10-18 14:36:11

标签: node.js ibm-cloud datasource cloudant loopback

我正在使用Node.js,并且我使用Cloudant连接器作为环回的数据源。

我定义了一个名为User的模型,定义如下:

var User = db.define('User', {
  lastName: { type: String },
  firstName: { type: String },
  skills: []
});

我有这个模型的实例,如:

{
    "lastName": "Doe",
    "firstName": "John",
    "skills": [
      {
        "id": "0",
        "text": "JAVA"
      },
      {
        "id": "1",
        "text": "CSS"
      },
      {
        "id": "2",
        "text": "HTML"
      },
      {
        "id": 3,
        "text": "JAVASCRIPT"
      },
      {
        "id": 4,
        "text": ".NET"
      }
    ],
    "id": "d981b42c3a2a13da382102c76652b96e"
  }

我想更新实例,以便技能数组只包含以下信息:

"skills": [
      {
        "id": "0",
        "text": "JAVAFX"
      },
      {
        "id": "1",
        "text": "CSS3"
      }
    ]

我想使用这个功能:

app.post('/updateProfile', function(req, res) {
  User.updateAll(
    {_id:req.body.id}, 
    {skills: req.body.skills},
    function(err,items){
    if(err){
      res.send(err);
    } else {
      res.sendStatus(200);
    }
  });
});

但是,我面临的问题是只更新具有相同ID的技能。我想删除的那些(在示例中它的HTML,JAVASCRIPT和.NET)不会被删除。

我如何才能真正取代技能而不仅仅是更新?我已尝试过文档中描述的其他一些内容,但它无法正常工作。 Documentation is available here

1 个答案:

答案 0 :(得分:1)

确认它是loopback-connector-cloudant中的一个错误。 提起了一个错误:https://github.com/strongloop/loopback-connector-cloudant/issues/44

其他环回数据源,如"内存"将替换整个skills对象,它可以正常工作。

作为一种解决方法,您可以使用一个methond User.replaceById(id, {data}, cb)来替换整个技能属性。 补丁仍在验证中,尚未发布,只要发布时我会在此处更新:https://github.com/strongloop/loopback-connector-cloudant/pull/34

所以在你的情况下,它应该是

User.replaceById('d981b42c3a2a13da382102c76652b96e', { "lastName": "Doe", "firstName": "John", "skills": [ { "id": "0", "text": "JAVAFX" }, { "id": "1", "text": "CSS3" } ] }, function(err, replacedInstance){ // get your replaced instance here })

此方法的一个限制是您必须在更新数据中包含未更改的属性,例如lastNamefirstName