У меня есть коллекция под названием user , которая имеет следующую структуру.
{
"_id" : ObjectId("5d4ae50fbdc1cd6351dab49f"),
"nombre" : "usuario1",
"Correo" : "correo1@gmail.com",
"playlist" :
[
{
"nombrePlay" : "play1",
"descPlay" : "descPlay",
"canciones" :
[
ObjectId("5d4ae655bdc1cd6351dab4c5")
]
}
]
}
У меня есть коллекция песен со следующей структурой
{
"_id" : ObjectId("5d4ae655bdc1cd6351dab4c5"),
"nombreCancion" : "cancion1",
"detalleCancion" : "detalleCancion"
}
, что я пытаюсь, что, когда я добираюсь до usuario1
, он не просто показывает мне список playlist
] если нет, то и описание песни ..
но при выполнении db.usuarios.find()
я возвращаю ту же структуру, показанную в начале, чтобы вставить данные, основанные на следующей части документации
Понимая, что ты используешь MongoDB 3.2 + (я жду, что sГ-), чтобы получать данные об одной colecciГіn на другой посредством ссылки, которую ты показал, ты должен использовать процесс AgregaciГіn , который дебет состоять из двух этапов:
$match
: В течение этого этапа осуществляется фильтр, чтобы позволять sГіlo документы, что они совпали с данным фильтром. В твоем особенном случае фильтр serГ - в: {"nombre": "usuario1"}
. Таким образом, возвращенные документы serГЎn все те, поле которых назвало, совпадите с фильтром. $lookup
: В течение этого этапа реализует одна bГєsqueda (на той же базе данных), элементов другой colecciГіn, что соответствуют стоимости, сохраняемой как ссылка в ней colecciГіn на той, которая применяет ее к нему agregaciГіn. Они parГЎmetros, что используются в этом этапе: from
: Покажи ее colecciГіn, с которой extraerГЎn снабженные ссылками данные. В твоем случае его canciones
. localField
: Покажи поле ее colecciГіn (на которой он применяет ее к нему agregaciГіn), что содержит ссылки на другую colecciГіn. В твоем случае, локального поля playlist.canciones
. foreignField
: Показывает поле (ее colecciГіn показанная в from
), что совпадает со ссылкой, показанной в localField
. В твоем случае поля _id
, так как ты сохранял, как он снабжает ссылками стоимость _id
документов ее colecciГіn canciones
. as
: Определяет имя нового Array
, что contendrГЎ документы ее colecciГіn (определенная в from
) с попросившими данными. Если поле не существует, тот же самый serГЎ aГ±adido в результате, взамен, если тот же самый существует, serГЎ замененный попросившими данными. В твоем случае ты можешь на писании поля playlist.canciones
. AsГ - твоя консультация может оставаться следующей формы:
db.usuarios.aggregate([
{$match: {nombre: "usuario1"}},
{$lookup: {
from: "canciones",
localField: "playlist.canciones",
foreignField: "_id",
as: "playlist.canciones"
}}
]);
Полученный результат может поверните следующей формы:
{
"_id" : ObjectId("5d6e5bf286eca88ff939304c"),
"nombre" : "usuario1",
"correo" : "correo1@gmail.com",
"playlist" : {
"nombrePlay" : "play1",
"descPlay" : "descPlay",
"canciones" : [
{
"_id" : ObjectId("5d6e5bf286eca88ff9393049"),
"nombreCancion" : "cancion1",
"detalleCancion" : "detalle1"
},
{
"_id" : ObjectId("5d6e5bf286eca88ff939304a"),
"nombreCancion" : "cancion2",
"detalleCancion" : "detalle2"
},
{
"_id" : ObjectId("5d6e5bf286eca88ff939304b"),
"nombreCancion" : "cancion3",
"detalleCancion" : "detalle3"
}
]
}
}
Надеялся, что это объясняет тебе сомнение и помогает тебе решать проблему.
Замечает
Array
с обработанными документами. $lookup
есть одна restricciГіn на разделенных на части коллекциях (sharded
). Ты можешь читать mГЎs в Сардед Кольектион Restrictions