Вы можете сделать это, используя конвейер агрегации, но это боль, чтобы написать его самостоятельно.
Вы можете использовать mongo-join-query
, чтобы автоматически создать конвейер агрегации из вашего запроса.
Так будет выглядеть ваш запрос:
const mongoose = require("mongoose");
const joinQuery = require("mongo-join-query");
joinQuery(
mongoose.models.Comment,
{
find: { pid:444 },
populate: ["uid"]
},
(err, res) => (err ? console.log("Error:", err) : console.log("Success:", res.results))
);
Ваш результат будет иметь пользовательский объект в поле uid
, и вы можете связать столько уровней, сколько хотите. Вы можете заполнить ссылку на пользователя, которая ссылается на команду, которая ссылается на что-то еще и т. Д.
Отказ от ответственности: я написал mongo-join-query
для решения этой точной проблемы.
Очень интересный вопрос и очень похвальный репекс. Мне удалось найти решение. Вы можете заменить ваш серверный объект следующим образом:
server <- function(input, output, session) {
alld <- reactiveValues()
alld$ui <- list()
# Action to add new Segment
observeEvent(input$addSeg,{
new_id <- length(alld$ui) + 1
sub_name <- paste0("addSub_", new_id)
alld$ui[[new_id]] <- list(
actionButton(sub_name, "Add a Sub Segment")
)
observeEvent(input[[sub_name]], {
new_text_id <- length(alld$ui[[new_id]]) + 1
alld$ui[[new_id]][[new_text_id]] <- HTML(paste0("<br>addSub<br>"))
})
})
output$myUI <- renderUI({alld$ui})
output$txt <- renderText({
capture.output(str(alld$ui))
})
}
Давайте поговорим о вашем исходном коде. Ваш первый наблюдатель работает просто отлично. Второй, однако, вызывает нежелательное поведение. Возвращает список новых наблюдателей, по одной на каждую кнопку addSub
, которая в данный момент находится в приложении. Это означает, что при первом щелчке он создает наблюдателя для addSub_1
, а при втором щелчке возвращает наблюдателя для addSub_1
и addSub_2
. Однако первый addSub_1
наблюдатель все еще существует. Это означает, что при нажатии addSub_1
отвечают два наблюдателя, и текст отображается дважды.
Мое решение - объединить двух ваших наблюдателей в одного. Когда вы нажимаете addSeg
, кнопка создается в списке UI, и также создается наблюдатель, который ее обрабатывает. Таким образом, нет дубликатов, и приложение работает, как и ожидалось.