У меня есть массив объектов, и каждый объект имеет ключ "user_id", и мне нужно получить больше информации от этого пользователя в Rethinkdb - PullRequest
0 голосов
/ 22 декабря 2018

Привет и спасибо всем.Я получаю данные с reql в rethinkdb.У меня есть объект json, внутри этого объекта есть массив объектов, называемых «пользователи».В каждом из этих объектов у меня есть ключ «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")
    })
})

Кто-нибудь знает, как это сделать?Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Решение использует 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)
})
0 голосов
/ 23 декабря 2018

Я немного озадачен вашей моделью данных, было бы неплохо, если бы вы приложили несколько примеров, чтобы знать, какая таблица содержит какие именно данные.Было бы проще проверить ответы.При этом я думаю, что это должно быть примерно так:

.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, которое вы вводитеВ результате подзапроса
  • для этого подзапроса вы используете userIds, которые присутствуют в вашем объекте "chat"
  • , вам необходимо преобразовать "users" в массив, чтобы он был совместим сфункция "getAll"

Я специально создал дополнительную часть "userDetails" в объекте "чат", потому что я не уверен, что перезапись существующих "пользователей" будет работать.

...