rethinkdb使用java更新数组中的对象

时间:2018-03-07 07:27:00

标签: java rethinkdb

我有以下文档,我必须更新特定UserId的isRead。我将不得不根据StoryId搜索数据库,所以我把它作为二级索引。

{
    "DateCreated": "2018-03-07 11:53:33" ,
    "StoryId": "8744d61e-fe8c-41eb-ae51-556ea47a217f" ,
    "Users": [
        {
            "UserId": "8ee4ba69-c284-4e18-badc-9f9e164fe020" ,
            "isRead": "false"
        } ,
        {
            "UserId": "b286914e-0b26-4d7f-baa2-7d638e0bb0c8" ,
            "isRead": "false"
        }
    ] ,
    "id": "a959daac-4399-4feb-af91-951f84a6bc32"
}

这是我到目前为止所尝试的查询:

ReqlExpr expr = r.db("MyDb").table("MyTable").
    getAll(sStoryId).optArg("index", "StoryId").
    update(row -> row.g("Users").map(doc-> r.branch(doc.g("UserId").eq(sUserId),doc.merge(obj), doc)));

其中obj = {isRead=true}

我收到错误:

Inserted value must be an OBJECT (got ARRAY):
[
        {
                "UserId": "8ee4ba69-c284-4e18-badc-9f9e164fe020",
                "isRead": "false"
        },
        {
                "UserId": "b286914e-0b26-4d7f-baa2-7d638e0bb0c8" ,
                "isRead": "true"
        }
]

有人知道如何解决这个问题吗?

我正在寻找java中的解决方案。

(使用javascript我可以像这样更新):

r.db('MyDb').table('MyTable').get("9b46f1ae-86ce-46b0-b502-e2831f2dced9")
  .update(function (row) {
    return {
      Users: row('Users').filter(function (client) {
        return client('UserId').ne('b286914e-0b26-4d7f-baa2-7d638e0bb0c8')
      })
      .append({ UserId: 'b286914e-0b26-4d7f-baa2-7d638e0bb0c8', isRead: 'true' })
    };
  });

2 个答案:

答案 0 :(得分:1)

我不能发表评论,因为我没有足够的声誉..

我想你是在给你的查询一个数组? 您可以将其转换为HashMap并测试它是否有帮助

我在RethinkDB网站上阅读的每篇关于java的文档都使用HashMaps到处传递和接收数据。

答案 1 :(得分:0)

抱歉,我之前没有发布我的回答。

这就是我最终要做的事情。我不确定这是否是进行更新的有效方式

expr = r.db("MyDB").table("MyTable").
    getAll(sStoryId).optArg("index", "StoryId").
    update(row -> r.hashMap("Users", row.g("Users").filter(col -> col.g("UserId").ne(sUserId)).append(obj)));

基本上这就是我正在做的事情,我正在过滤所有{UserId, isRead}对象,这些对象不等于我正在寻找的 UserId ,然后附加一个上述组的新对象。这个过滤和追加是在hashMap上完成的。

我用json字符串构造了一个新对象,如下所示:

{"b286914e-0b26-4d7f-baa2-7d638e0bb0c8": "true"} 其中b286914e-0b26-4d7f-baa2-7d638e0bb0c8是我正在寻找的UserId。