Можно подумать, что следующий код должен теоретически работать:
db.collection.aggregate({
$project: {
"abc": 1, // include the "abc" field in the output
"geometry": { // add a new geometry sub-document
"type": "LineString", // with the hardcoded "type" field
"coordinates": {
$map: {
"input": "$geometry", // transform each item in the "geometry" array
"as": "this",
"in": [ "$$this.lng", "$$this.lat" ] // into an array of values only, ith "lng" first, "lat" second
}
}
}
}
}, {
$out: "result" // creates a new collection called "result" with the transformed documents in it
})
Однако , как MongoDB работает на данном этапе в соответствии с SERVER-37635 заключается в том, что приведенный выше запрос приводит к неожиданному выводу, когда поле coordinates
содержит требуемый результат несколько раз.Таким образом, следующий запрос можно использовать для генерации желаемого результата:
db.collection.aggregate({
$addFields: {
"abc": 1,
"geometry2": {
"type": "LineString",
"coordinates": {
$map: {
"input": "$geometry",
"as": "this",
"in": [ "$$this.lng", "$$this.lat" ]
}
}
}
}
}, {
$project: {
"abc": 1,
"geometry": "$geometry2"
}
}, {
$out: "result"
})
В разделе комментариев билета JIRA, упомянутого выше, Чарли Свансон упоминает другой обходной путь, который использует $let
, чтобы «обмануть» MongoDB винтерпретировать запрос желаемым образом.Я пересылаю его сюда (обратите внимание, что в нем отсутствует часть $out
):
db.collection.aggregate([
{
$project: {
"abc": 1,
"geometry": {
$let: {
vars: {
ret: {
"type": "LineString",
"coordinates": {
$map: {
"input": "$geometry",
"as": "this",
"in": [
"$$this.lng",
"$$this.lat"
]
}
}
}
},
in: "$$ret"
}
}
}
}
])