Внутри $ map вы можете использовать as
, чтобы определить временную переменную, которая будет представлять отдельный документ из вашего metrics
, а затем ссылаться на эту переменную в части in
.
db.col.aggregate([{'$project': {'metrics': {'$map': {'input': '$metrics', as: 'metric', 'in': '$$metric.name' } } } }])
или вы можете напрямую ссылаться на временную переменную this
db.col.aggregate([{'$project': {'metrics': {'$map': {'input': '$metrics', 'in': '$$this.name' } } } }])
Дело в том, что каждый раз, когда вы используете один знак доллара, вы ссылаетесь на поле, определенное вдокумент, который обрабатывается на текущей стадии конвейера.Кроме того, вы можете использовать двойной знак доллара для ссылки на некоторые переменные, которые могут быть определены операторами, такими как $map
, $filter
и т. Д.
Вы можете попробовать свой исходный код для следующего документа:
{
_id: 123,
this: { name: "x" },
metrics: [{ }, { } ]
}
и вы получите массив с двумя значениями x
, поскольку есть две метрики, но каждая итерация ссылается на одно и то же значение this.x
:
{ "_id" : 123, "metrics" : [ "x", "x" ] }