我有一个对象数组,每个对象都有一个 "user_id" 键,我需要从 Rethinkdb 中的这个用户那里获取更多信息
I have an array of objects and each object has a "user_id" key and I need to get more information from this user in Rethinkdb
大家好,谢谢大家。我在 rethinkdb 中使用 reql 获取数据。我有一个 json 对象,在这个对象中有一个名为 "users" 的对象数组。在这些对象中的每一个中,我都有一个 "id" 键,我需要从这个 "id" 中获取更多的用户字段,并将这些字段添加到同一个用户对象中。
这是获取信息的代码:
const id = req.id
r.table("chats").filter(function (chat) { // Get chats
return chat("users").contains(function (user) {
return user("id").eq(id)
})
}).map(function (chat) { // Get messages from every chat
return chat.merge({
"messages":
r.table("messages").eqJoin("user_id", r.table('users'))
.zip()
.pluck("id", "creation_date", "message", "email", "username", "status")
.orderBy(r.asc('creation_date'))
.coerceTo('array')
})
}).run(connection).then(function (cursor) {
return cursor.toArray()
}).then(function (chats) {
res.json({ success: 1, chats })
}).catch(function (err) {
sendError(res, "Error -> " + err)
})
这是结果:
{
"success": 1,
"chats": [
{
"id": "8c4a58ef-4fb2-4084-af28-d9d04da0651c",
"image": null,
"is_group": false,
"messages": [
{
"creation_date": "Fri Dec 21 2018 09:21:17 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Felices fiestas por cierto, saludos a la familia",
"status": "SAVED",
"username": "John García"
},
{
"creation_date": "Fri Dec 21 2018 09:21:27 GMT+0100 (CET)",
"email": "eoeoeoeoe@wwwww.eu",
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc",
"message": "Bien, estoy en la oficina ",
"status": "SENT",
"username": "Chester López"
}
],
"name": null,
"users": [
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
},
{
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc"
}
]
},
{
"id": "3a3501f3-7a17-4261-a0aa-3cae94f58f18",
"image": null,
"is_group": false,
"messages": [
{
"creation_date": "Fri Dec 21 2018 09:21:27 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Bien, estoy en la oficina ",
"status": "SENT",
"username": "John García"
},
{
"creation_date": "Fri Dec 21 2018 09:22:53 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Espero que estéis todos genial",
"status": "SENDING",
"username": "John García"
},
{
"creation_date": "Thu Dec 20 2018 16:41:02 GMT+0100 (CET)",
"email": "eoeoeoeoe@wwwww.eu",
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc",
"message": "¿How are you?",
"status": "SEEN",
"username": "Chester López"
}
],
"name": null,
"users": [
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
},
{
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc"
}
]
}
]
}
我需要每个用户对象成为:
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
"email": "blabla@sssssss.eu",
"image": null,
"username": "John García"
}
我试过这样做和更多的测试,但它不起作用:
.map(function(chat){ // Get info from every user in every chat
return chat("users").map(function(user) {
return r.table("users").filter({id: user("id")})
.pluck("id", "email", "username", "image")
})
})
有人知道怎么做吗?谢谢。
我对你的数据模型有点困惑,如果你能附上一些样本,知道哪个 table 有什么数据,那就太好了。测试答案会更容易。话虽如此,我认为它应该是这样的:
.map(function(chat){
return chat.merge({
"userDetails":
r.table("users")
.getAll(
r.args(
chat("users").map(function(doc){return doc("id")})
)
.pluck("id", "email", "username", "image")
})
})
- 您将每个 "chat" 文档与一个额外字段合并 "userDetails"
- 在 userDetails 字段中输入子查询的结果
- 对于此子查询,您使用 "chat" 对象中存在的用户 ID
- 您需要将 "users" 转换为数组,以便与 "getAll" 函数兼容
我特意在 "chat" 对象中创建了一个额外的 "userDetails" 部分,因为我不确定覆盖现有的 "users" 是否可行。
解决方案是使用concapmap。我希望这对某人有所帮助。
const id = req.id
r.table("chats").filter(chat => {
return chat("users").contains(function (user) {
return user("id").eq(id)
})
}).map(chat => {
return chat.merge({
"messages":
r.table("messages").eqJoin("user_id", r.table('users'))
.zip()
.filter(message => {
return message("user_id").eq(message("id")).and(message("chat_id").eq(chat("id")))
})
.pluck("id", "creation_date", "message", "email", "username", "status")
.orderBy(r.asc('creation_date'))
.coerceTo('array'),
"users":
chat("users").concatMap(user => {
return r.table("users").filter(usu => {
return usu("id").eq(user("id"))
}).pluck("id", "email", "username", "image")
})
})
})
.run(connection).then(function (cursor) {
return cursor.toArray()
}).then(function (chats) {
res.json({ success: 1, chats })
}).catch(function (err) {
sendError(res, "Error -> " + err)
})
大家好,谢谢大家。我在 rethinkdb 中使用 reql 获取数据。我有一个 json 对象,在这个对象中有一个名为 "users" 的对象数组。在这些对象中的每一个中,我都有一个 "id" 键,我需要从这个 "id" 中获取更多的用户字段,并将这些字段添加到同一个用户对象中。
这是获取信息的代码:
const id = req.id
r.table("chats").filter(function (chat) { // Get chats
return chat("users").contains(function (user) {
return user("id").eq(id)
})
}).map(function (chat) { // Get messages from every chat
return chat.merge({
"messages":
r.table("messages").eqJoin("user_id", r.table('users'))
.zip()
.pluck("id", "creation_date", "message", "email", "username", "status")
.orderBy(r.asc('creation_date'))
.coerceTo('array')
})
}).run(connection).then(function (cursor) {
return cursor.toArray()
}).then(function (chats) {
res.json({ success: 1, chats })
}).catch(function (err) {
sendError(res, "Error -> " + err)
})
这是结果:
{
"success": 1,
"chats": [
{
"id": "8c4a58ef-4fb2-4084-af28-d9d04da0651c",
"image": null,
"is_group": false,
"messages": [
{
"creation_date": "Fri Dec 21 2018 09:21:17 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Felices fiestas por cierto, saludos a la familia",
"status": "SAVED",
"username": "John García"
},
{
"creation_date": "Fri Dec 21 2018 09:21:27 GMT+0100 (CET)",
"email": "eoeoeoeoe@wwwww.eu",
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc",
"message": "Bien, estoy en la oficina ",
"status": "SENT",
"username": "Chester López"
}
],
"name": null,
"users": [
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
},
{
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc"
}
]
},
{
"id": "3a3501f3-7a17-4261-a0aa-3cae94f58f18",
"image": null,
"is_group": false,
"messages": [
{
"creation_date": "Fri Dec 21 2018 09:21:27 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Bien, estoy en la oficina ",
"status": "SENT",
"username": "John García"
},
{
"creation_date": "Fri Dec 21 2018 09:22:53 GMT+0100 (CET)",
"email": "blabla@sssssss.eu",
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a",
"message": "Espero que estéis todos genial",
"status": "SENDING",
"username": "John García"
},
{
"creation_date": "Thu Dec 20 2018 16:41:02 GMT+0100 (CET)",
"email": "eoeoeoeoe@wwwww.eu",
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc",
"message": "¿How are you?",
"status": "SEEN",
"username": "Chester López"
}
],
"name": null,
"users": [
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
},
{
"id": "72b4350d-a025-4dc1-9038-8e13c3ec12dc"
}
]
}
]
}
我需要每个用户对象成为:
{
"id": "6c240de3-94e7-4b1c-9ef3-218dc71d8b0a"
"email": "blabla@sssssss.eu",
"image": null,
"username": "John García"
}
我试过这样做和更多的测试,但它不起作用:
.map(function(chat){ // Get info from every user in every chat
return chat("users").map(function(user) {
return r.table("users").filter({id: user("id")})
.pluck("id", "email", "username", "image")
})
})
有人知道怎么做吗?谢谢。
我对你的数据模型有点困惑,如果你能附上一些样本,知道哪个 table 有什么数据,那就太好了。测试答案会更容易。话虽如此,我认为它应该是这样的:
.map(function(chat){
return chat.merge({
"userDetails":
r.table("users")
.getAll(
r.args(
chat("users").map(function(doc){return doc("id")})
)
.pluck("id", "email", "username", "image")
})
})
- 您将每个 "chat" 文档与一个额外字段合并 "userDetails"
- 在 userDetails 字段中输入子查询的结果
- 对于此子查询,您使用 "chat" 对象中存在的用户 ID
- 您需要将 "users" 转换为数组,以便与 "getAll" 函数兼容
我特意在 "chat" 对象中创建了一个额外的 "userDetails" 部分,因为我不确定覆盖现有的 "users" 是否可行。
解决方案是使用concapmap。我希望这对某人有所帮助。
const id = req.id
r.table("chats").filter(chat => {
return chat("users").contains(function (user) {
return user("id").eq(id)
})
}).map(chat => {
return chat.merge({
"messages":
r.table("messages").eqJoin("user_id", r.table('users'))
.zip()
.filter(message => {
return message("user_id").eq(message("id")).and(message("chat_id").eq(chat("id")))
})
.pluck("id", "creation_date", "message", "email", "username", "status")
.orderBy(r.asc('creation_date'))
.coerceTo('array'),
"users":
chat("users").concatMap(user => {
return r.table("users").filter(usu => {
return usu("id").eq(user("id"))
}).pluck("id", "email", "username", "image")
})
})
})
.run(connection).then(function (cursor) {
return cursor.toArray()
}).then(function (chats) {
res.json({ success: 1, chats })
}).catch(function (err) {
sendError(res, "Error -> " + err)
})