Проект вложенного документа на корневой уровень без использования $ project - PullRequest
0 голосов
/ 06 декабря 2018

Используя агрегатный конвейер, я пытаюсь проецировать внедренный документ на корневой уровень БЕЗ проецирования каждого поля отдельно и без замены корневого уровня.

Например, я хочу проецировать эту коллекцию на корневой уровень:

[
    {
        _id: "1",
        city: "NY"
        user: [ {
            firstName: "John",
            lastname: "Peters",
            brothers: [
                { _id: "B1",
                  brotherFirstName: "Karl" }
            ]
         }, {
            firstName: "Raul",
            lastname: "Other",
            brothers: [
                { _id: "B2",
                  brotherFirstName: "May" }
            ]
         }, {
            firstName: "Paul",
            lastname: "Ray",
            brothers: [
                { _id: "B3",
                  brotherFirstName: "Bryan" }
            ]
         }        
    },
    {
        _id: "2",
        city: "NY"
        user: [ {
            firstName: "Joe",
            lastname: "Anders",
            brothers: [
                { _id: "B4",
                  brotherFirstName: "Carla" }
            ]
         }, {
            firstName: "Zoy",
            lastname: "Bat",
            brothers: [
                { _id: "B5",
                  brotherFirstName: "Stuart" }
            ]
         }, {
            firstName: "Ana",
            lastname: "Lily",
            brothers: [
                { _id: "B6",
                  brotherFirstName: "Carter" }
            ]
         }        
    }
]

Это то, что я ищу: для каждого документа в массиве вложенных документов я хочу проецировать его на корневой уровень, поэтому для каждого "пользователя" я хочу проецировать его на "новый документ" идля каждого «брата» я хочу проецировать его на «новый документ»

[{
  _id: "1",
  city: "NY"
  firstName: "John",
  lastname: "Peters",
  brotherFirstName: "Karl" 
}, { 
  _id: "1",
  city: "NY"
  firstName: "Raul",
  lastname: "Other",
  brotherFirstName: "May" 
}, {
  _id: "1",
  city: "NY"
  firstName: "Paul",
  lastname: "Ray",
  brotherFirstName: "Bryan" 
}, {
  _id: "2",
  city: "NY"
  firstName: "Joe",
  lastname: "Anders",
  brotherFirstName: "Carla"
 }, {
  _id: "2",
  city: "NY"
  firstName: "Zoy",
  lastname: "Bat",
  brotherFirstName: "Stuart"
 }, {
  _id: "2",
  city: "NY"
  firstName: "Ana",
  lastname: "Lily",
  brotherFirstName: "Carter"
 }        
]

Я пытался агрегировать $ unwind e $ replaceRoot, но я не могу «заменить корень», потому что мне нужно эти поля

db.getCollection('myColl').aggregate([  { $unwind : "$users" },  {$replaceRoot: { newRoot: "$users" }}, {$unwind : "$brothers" } ])

РЕДАКТИРОВАТЬ

Выполнение запроса @Anthony Winzlet У меня был такой вывод:

[
  {
    "_id": "B1",
    "brotherFirstName": "Karl",
    "city": "NY",
    "firstName": "John",
    "lastname": "Peters"
  },
  {
    "_id": "B2",
    "brotherFirstName": "May",
    "city": "NY",
    "firstName": "Raul",
    "lastname": "Other"
  },
  {
    "_id": "B3",
    "brotherFirstName": "Bryan",
    "city": "NY",
    "firstName": "Paul",
    "lastname": "Ray"
  },
  {
    "_id": "B4",
    "brotherFirstName": "Carla",
    "city": "NY",
    "firstName": "Joe",
    "lastname": "Anders"
  },
  {
    "_id": "B5",
    "brotherFirstName": "Stuart",
    "city": "NY",
    "firstName": "Zoy",
    "lastname": "Bat"
  },
  {
    "_id": "B6",
    "brotherFirstName": "Carter",
    "city": "NY",
    "firstName": "Ana",
    "lastname": "Lily"
  }
]

Поле _id было перезаписано полем _id брата.Мне нужен проект _id от root

1 Ответ

0 голосов
/ 06 декабря 2018

Вам необходимо использовать $mergeObjects с документом $$ROOT.Сначала с user, затем с brother и, наконец, вы должны использовать $project, чтобы удалить объекты user и brother

db.collection.aggregate([
  { "$unwind": "$user" },
  { "$replaceRoot": {
    "newRoot": { "$mergeObjects": ["$$ROOT", "$user"] }
  }},
  { "$unwind": "$brothers" },
  { "$replaceRoot": {
    "newRoot": { "$mergeObjects": ["$brothers", "$$ROOT"] }
  }},
  { "$project": { "brothers": 0, "user": 0 }}
])

Выход

[
  {
    "_id": "1",
    "brotherFirstName": "Karl",
    "city": "NY",
    "firstName": "John",
    "lastname": "Peters"
  },
  {
    "_id": "1",
    "brotherFirstName": "May",
    "city": "NY",
    "firstName": "Raul",
    "lastname": "Other"
  },
  {
    "_id": "1",
    "brotherFirstName": "Bryan",
    "city": "NY",
    "firstName": "Paul",
    "lastname": "Ray"
  },
  {
    "_id": "2",
    "brotherFirstName": "Carla",
    "city": "NY",
    "firstName": "Joe",
    "lastname": "Anders"
  },
  {
    "_id": "2",
    "brotherFirstName": "Stuart",
    "city": "NY",
    "firstName": "Zoy",
    "lastname": "Bat"
  },
  {
    "_id": "2",
    "brotherFirstName": "Carter",
    "city": "NY",
    "firstName": "Ana",
    "lastname": "Lily"
  }
]
...