【问题标题】:RethinkDB: Javascript - How to deleted nested objectsRethinkDB:​​Javascript - 如何删除嵌套对象
【发布时间】:2018-04-24 16:23:41
【问题描述】:

我在尝试从我的表中删除嵌套对象时遇到了很大的困难,而在此过程中不会意外删除我的所有数据(现在发生了 3 次,感谢上帝我复制了)。

我的对象:

{
  "value1": thing,
  "value2": thing,
  "value3": thing,
  "roles": {
    "1": {
      "name": "Dave",
      "id": "1"
    },
    "2": {
      "name": "Jeff",
      "id": "2"
    },
    "3": {
      "name": "Rick",
      "id": "3"
    },
    "4": {
      "name": "Red",
      "id": "4"
    }
  }
}`

我尝试了许多重新思考的查询,但到目前为止都没有奏效。需要注意的是 1、2、3 和 4 是可以有任意数量的数字的变量,因此我的查询必须反映这一点。

一些尝试的查询:

function removeRole(id, roleName) {
        let role = `${roleName}`
        return this.r.table('guilds').get(id).replace(function(s){
            return s.without({roles : {[role] : { "name": role }}})
        })
    }
function removeRole(id, roleName) {
        return this.r.table('guilds').getAll(id).filter(this.r.replace(this.r.row.without(roleName))).run()
    }
function removeRole(id, roleName) {
        return this.r.table('guilds').get(id)('roles')(roleName).delete()
    }

非常感谢任何帮助,如果问题有问题,请告诉我。对此仍然相当新,因此感谢您的反馈。

【问题讨论】:

    标签: javascript json node.js rethinkdb rethinkdb-javascript


    【解决方案1】:

    我不确定我是否理解您的意图,但以下查询似乎可以完成您想要完成的工作:

    r.db('test')
      .table('test')
      .get(id)
      .replace((doc) => {
        // This expression makes sure that we delete the specified keys only
        const roleKeys = doc
          .getField('roles')
          .values()
          // Make sure we have a role name is in the names array
          .filter(role => r.expr(names).contains(role.getField('name')))
          // This is a bit tricky, and I believe I implemented this in a not efficient
          // way probably missing a first-class RethinkDB expression that supports
          // such a case out of box. Since we are going to delete by nested dynamic
          // ids, RethinkDB requires special syntax to denote nested ids:
          //     {roles: {ID_1: true, ID_2: true}}
          // Well, this is just a JavaScript syntax workaround, so we're building
          // such an object dynamically using fold.
          .fold({}, (acc, role) => acc.merge(r.object(role.getField('id'), true)));
        return doc.without({roles: roleKeys});
      })
    

    例如,如果names 是一个数组,比如['Jeff', 'Rick'],则嵌套的roleKeys 表达式将被动态评估为:

    {2: true, 3: true}
    

    即被合并到roles 选择器中,上面的查询将转换文档如下:

    {
      "value1": ...,
      "value2": ...,
      "value3": ...,
      "roles": {
        "1": {"name": "Dave", "id": "1"},
        "4": {"name": "Red", "id": "4"}
      }
    }
    

    【讨论】:

    • 工作就像一个魅力,非常感谢。今天为我节省了另一组充满压力的时间。如果可以,为什么这种方法效率低下?它似乎按预期完美地工作,我可以看到几乎没有出错的余地。
    • @Laz 很高兴听到我可以为您节省一些时间,也谢谢您!实际上,我不太确定 roleKeys 表达式是否可以用一些 RethinkDB 内置插件以更简单的方式重写,这些内置插件可以完全按照我在我的答案中实现的功能。我会说valuesfilterfold+merge+object 的链对我来说有点笨拙。如果您找到摆脱链条的更好方法,请随时修改我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2019-12-13
    • 2020-05-27
    • 2018-04-28
    • 2017-04-25
    相关资源
    最近更新 更多