Mongodb - как получить только часть документа - PullRequest
0 голосов
/ 16 декабря 2018

Структура моего документа выглядит следующим образом:

first: [{ 
    _id1: 'a',
    second: [{
        _id2: 'A',
        third: [{
            _id3: '1'
            name: 'name1',
            exampleField: 'xxx1'
        }, {
            _id3: '2'
            name: 'name2',
            exampleField: 'xxx2'
        }]
    }, {
        _id2: 'B',
        third: [{
            _id3: '3'
            name: 'name3',
            exampleField: 'xxx3'
        }, {
            _id3: '4'
            name: 'name4',
            exampleField: 'xxx4'
        }]
    }]
}, { 
    _id1: 'b',
    second: [{
        _id2: 'C',
        third: [{
            _id3: '5'
            name: 'name5',
            exampleField: 'xxx5'
        }, {
            _id3: '6'
            name: 'name6',
            exampleField: 'xxx6'
        }]
    }, {
        _id2: 'D',
        third: [{
            _id3: '7'
            name: 'name7',
            exampleField: 'xxx7'
        }, {
            _id3: '8'
            name: 'name8',
            exampleField: 'xxx8'
        }]
    }]
}]

Как получить только часть «третьего» массива, имя которого равно «name8»?

Я хочу получитьчто-то вроде этого:

{ 
   _id1: 'a', 
   _id2: 'D', 
   _id3: '8', 
   name: 'name8', 
   exampleField: 'xxx8' 
}

Я подозреваю, что мне нужно использовать $ filter или $ unwind, но как именно его использовать?После многих попыток у меня больше нет идей ..

1 Ответ

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

Вы можете использовать $ unwind вместе с продвижением вложенных полей, которые вам нужны в выводе. Рабочий образец

db.collection.aggregate([
  {
    $match: {
      "first.second.third.name": "name8"
    }
  },
  {
    $unwind: "$first"
  },
  {
    $unwind: "$first.second"
  },
  {
    $unwind: "$first.second.third"
  },
  {
    $match: {
      "first.second.third.name": "name8"
    }
  },
  {
    $project: {
      "_id": 0,
      "_id1": "$first._id1",
      "_id2": "$first.second._id2",
      "_id3": "$first.second.third._id3",
      "name": "$first.second.third.name",
      "exampleField": "$first.second.third.exampleField"
    }
  }
])
...