Этап $unwind
создает новый документ для каждого элемента в массиве, который вы раскручиваете. Каждый новый документ будет содержать копию всех других полей в документе.
Если исходный документ выглядит как
{
_id: "unique",
Array1:["A","B","C"],
Array2:["D","E","F"],
}
После размотки «Массив1» в конвейере будет 3 документа :
[
{
_id: "unique",
Array1:"A",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"B",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"C",
Array2:["D","E","F"]
}
]
Тогда раскручивая «наблюдатели», вы развернете каждый массивов наблюдателей, так что у вас будет декартово произведение массивов. Детская площадка
В вашем случае исходный документ имеет 2 рецензии, но нет подписчиков и наблюдателей, поэтому в начале конвейера содержится один документ, аналогичный:
[
{
_id: "ObjectId",
data: "other data"
reviews: [{content:"review1", author:"ObjectId"},
{content:"review2", author:"ObjectId"}]
}
]
После первого отката у вас есть 2 документа:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"}
}
]
При первом поиске идентификатор автора заменяется данными для каждого документа, затем ко всем документам применяется вторая раскрутка.
Поскольку этот массив пуст, поиск возвращает пустой массив, и применяется третий размотчик. Непосредственно перед этапом $group
конвейер содержит 2 документа с массивами:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"},
followers: {author: []},
watchers: {author: []}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"},
followers: {author:[]},
watchers: {author: []}
}
]
Поскольку оба документа имеют одинаковый _id
, они сгруппированы вместе, и в конечном результате первый документ содержит " data ".
Для массивов, когда встречается каждый документ, значение соответствующего поля помещается в массив, в результате чего каждый массив имеет 2 значения.