Как я могу заполнить «компоненты» в примере документа:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
Это мой JS, где я получаю документ от Mongoose:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
я получу то же, что указано в примере документа. Ничего не изменилось.Ответы:
Mongoose 4.5 поддерживает это
И вы можете присоединиться к более чем одному глубокому уровню
источник
pages.$.page.component
нетpages.$.component
. Как он узнает, что нужно искать в объекте страницы?Это подходит для меня:
Документация: Model.populate
источник
Как отмечали другие,
Mongoose 4
поддерживает это. Очень важно отметить, что при необходимости вы также можете выполнять рекурсию глубже одного уровня, хотя в документации это не указано:источник
Таким образом вы можете заполнить несколько вложенных документов.
источник
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
Лучшее решение:
источник
page
есть другие ненаселенные свойства.Я нашел это очень полезным, создав перышки перед хуком для заполнения двухуровневого отношения. У моделей мангуста просто есть
затем в перьях перед крючком:
Так просто по сравнению с некоторыми другими методами, которые я пытался добиться.
источник
Я нашел этот вопрос через другой вопрос, который касался KeystoneJS, но был отмечен как повторяющийся. Если кто-то здесь может искать ответ Keystone, вот как я выполнил свой запрос с глубоким заполнением в Keystone.
Двухуровневая популяция мангуста с использованием KeystoneJs [дубликат]
источник
Вы также можете сделать это, используя
$lookup
агрегацию, и, вероятно, лучший способ, так как теперь заселение вымирает из монгоисточник
Mongoose 5.4 поддерживает это
источник
Для тех, у кого есть проблема,
populate
и они тоже хотят это сделать:clients
,users
,rooms
,messasges
.refPath
или динамическая ссылкаpopulate
сpath
иmodel
вариантыfindOneAndReplace
/replaceOne
с$exists
КОНТЕКСТ
Цель
clients
,users
&bot
.clients
илиusers
его модели Mongoose. Клиентские модели типа _sender естьclients
, для пользователя естьusers
.Схема сообщения :
РЕШЕНИЕ
Мой запрос API на стороне сервера
Мой код
Служебная функция (в
chatUtils.js
файле) для получения сообщения типа, которое вы хотите сохранить:Моя серверная часть (с использованием Nodejs), чтобы получить запрос на сохранение сообщения:
СОВЕТЫ :
Для базы данных:
refPath
мы используем утилиту,getSenderModel
которая используется вpopulate()
. Это из-за бота.sender.type
Может быть:users
с его базой данных,clients
с его базой данных иbot
без базы данных.refPath
Нуждается в истинной эталонной модели, если нет, то Mongooose выдаст ошибку.sender._id
может быть типаObjectId
для пользователей и клиентов илиnull
для бота.Для логики запроса API:
quickReply
сообщение (Message DB должен иметь только один quickReply, но , как многие простые текстовые сообщения , как вы хотите). Мы используемfindOneAndUpdate
вместоreplaceOne
илиfindOneAndReplace
.findOneAndUpdate
) иpopulate
операцию сcallback
каждым из них. Это важно , если вы не знаете , если использоватьasync/await
,then()
,exec()
илиcallback(err, document)
. Для получения дополнительной информации см. « Заполнить документ» .overwrite
опцией и без$set
оператора запроса.upsert
option.findOneAndUpdate
и дляpopulate()
.populate
, мы создаем настраиваемую ссылку на динамическую модель с расширениемgetSenderModel
. Мы можем использовать динамическую ссылку Mongoose, потому чтоsender.type
forbot
не имеет модели Mongoose. Мы используем базу данных для заполнения с помощьюmodel
иpath
optins.Я провел много часов, решая небольшие проблемы здесь и там, и я надеюсь, что это кому-то поможет! 😃
источник
Я боролась с этим целый кровавый день. Ни одно из вышеперечисленных решений не помогло. Единственное, что сработало в моем случае для следующего примера:
заключается в следующем: (Предполагается, что заполнение после выборки, но также работает при вызове заполнения из класса модели (за которым следует exec))
Другими словами, свойство самого внешнего пути должно содержать полный путь. Похоже, что ни один частично полный путь в сочетании с заполнением свойств не работал (и свойство модели не кажется необходимым; имеет смысл, поскольку оно включено в схему). У меня ушел целый день, чтобы понять это! Не уверен, почему другие примеры не работают.
(Используя Mongoose 5.5.32)
источник
Удалить ссылку на документы
Это сработало для меня.
источник