rethinkdb 使用 java 更新数组中的对象
rethinkdb update object in array using java
我有以下文档,我必须更新特定 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 中寻找解决方案。
(使用 java 脚本我可以像这样更新):
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' })
};
});
我无法发表评论,因为我没有足够的声誉..
我想你正在为你的查询提供一个数组?
您可以将其转换为 HashMap 并测试它是否有帮助
我在 RethinkDB 网站上阅读的每一篇关于 java 的文档都使用 HashMap 来传递和接收数据。
抱歉我没有post我之前的回答。
这就是我最终所做的。我不太确定这是否是进行更新的有效方法
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 的 {UserId, isRead}
对象,然后追加上述组的新对象。这种过滤和附加是在 hashMap 上完成的。
我从 json 字符串构建了新对象,如下所示:
{"b286914e-0b26-4d7f-baa2-7d638e0bb0c8": "true"}
其中 b286914e-0b26-4d7f-baa2-7d638e0bb0c8 是我正在寻找的 UserId。
我有以下文档,我必须更新特定 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 中寻找解决方案。
(使用 java 脚本我可以像这样更新):
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' })
};
});
我无法发表评论,因为我没有足够的声誉..
我想你正在为你的查询提供一个数组? 您可以将其转换为 HashMap 并测试它是否有帮助
我在 RethinkDB 网站上阅读的每一篇关于 java 的文档都使用 HashMap 来传递和接收数据。
抱歉我没有post我之前的回答。
这就是我最终所做的。我不太确定这是否是进行更新的有效方法
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 的 {UserId, isRead}
对象,然后追加上述组的新对象。这种过滤和附加是在 hashMap 上完成的。
我从 json 字符串构建了新对象,如下所示:
{"b286914e-0b26-4d7f-baa2-7d638e0bb0c8": "true"}
其中 b286914e-0b26-4d7f-baa2-7d638e0bb0c8 是我正在寻找的 UserId。