我有一个对象数组,每个对象都有一个 "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)
})