Запрос MongoDB с агрегацией - PullRequest
0 голосов
/ 29 июня 2018

Я использую MongoDB, и у меня есть эта модель данных для моей коллекции 'book':

{
    "_id" : ObjectId("5b32566e2796789e15f18cbe"),
    "service" : ObjectId("5b32550fe66a2c2d781a021e"),
    "state" : "paid",
    "observations" : "",
    "datetime_paid" : "",
    "price" : 50,
    "responsible" : {
        "name" : "Mark",
        "surname" : "Beckam",
        "birthdate" : "",
        "email" : "mark@example.com",
        "phone" : ""
    },
    "updates" : [],
    "tickets" : [ 
        {
            "passenger" : {
                "name" : "Mark",
                "surname" : "Beckam",
                "birthdate" : "",
                "email" : "mark@beckam.com",
                "phone" : "666 666 666"
            },
            "qr_id" : "pwenci3y32m",
            "roundtrip" : "ida_vuelta",
            "price" : 50,
        }
    ]
}

Теперь я пытаюсь запросить все билеты и ответственных за каждую книгу, которая совпадает с идентификатором сервиса. Мой подход состоит в следующем:

db.getCollection('books').aggregate([
    { $match: { service: ObjectId("5b32550fe66a2c2d781a021e") } },
    {
      $group: {
        _id: 0,
        tickets: { $push: "$tickets" }
      }
    },
    {
      $project: {
        tickets: {
          $reduce: {
            input: "$tickets",
            initialValue: [],
            in: { $setUnion: ["$$value", "$$this"] }
          }
        }
      }
    }
  ]);

С этим запросом я возвращаю полный список билетов через разные книги, но мне также нужны ответственные данные (которые есть в каждой книге) в каждом билете:

{
    "_id" : 0.0,
    "tickets" : [ 
        {
            "passenger" : {
                "name" : "Mark",
                "surname" : "Beckam",
                "birthdate" : "",
                "email" : "mark@beckam.com",
                "phone" : "666 666 666"
            },
            "qr_id" : "",
            "roundtrip" : "ida_vuelta",
            "price" : 50,
            // I need here the responsible field associated to the book that 
               contains that ticket
        }
    ]
}

Заранее спасибо

1 Ответ

0 голосов
/ 30 июня 2018

Как насчет этого:

db.getCollection('books').aggregate([
    { $match: { service: ObjectId("5b32550fe66a2c2d781a021e") } },
    { $addFields: { "tickets.responsible": "$responsible" } }, // push the responsible information into the "tickets" array
    { $unwind: "$tickets" }, // flatten out all "tickets" to individual documents
    {
      $group: {
        _id: 0,
        tickets: { $addToSet: "$tickets" } // addToSet will eliminate duplicate entries
      }
    }
  ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...