Как получить данные из другой коллекции?

У меня есть коллекция под названием 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() я возвращаю ту же структуру, показанную в начале, чтобы вставить данные, основанные на следующей части документации

1
задан 08.08.2019, 02:23
1 ответ

Понимая, что ты используешь MongoDB 3.2 + (я жду, что sГ-), чтобы получать данные об одной colecciГіn на другой посредством ссылки, которую ты показал, ты должен использовать процесс AgregaciГіn , который дебет состоять из двух этапов:

  1. Этап $match: В течение этого этапа осуществляется фильтр, чтобы позволять sГіlo документы, что они совпали с данным фильтром. В твоем особенном случае фильтр serГ - в: {"nombre": "usuario1"}. Таким образом, возвращенные документы serГЎn все те, поле которых назвало, совпадите с фильтром.
  2. Этап $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"
            }
        ]
    }
}

Надеялся, что это объясняет тебе сомнение и помогает тебе решать проблему.

Замечает

  • возвращенный результат serГЎ один Array с обработанными документами.
  • у этапа $lookup есть одна restricciГіn на разделенных на части коллекциях (sharded). Ты можешь читать mГЎs в Сардед Кольектион Restrictions
0
ответ дан 01.12.2019, 22:29
  • 1
    Я функционирую верно, Спасибо. – Richard 04.09.2019, 18:46

Теги

Похожие вопросы