Сценарий, который вы используете, - это monkey-patching DBCommandCursor.prototype.toCsv
для добавления метода toCsv
к курсорам, и кажется, что он не работает для курсоров агрегации по какой-то причине (и не работает вообще на версии монго я бегу).
Вместо того, чтобы выяснить, почему оболочка Монго не ведет себя так, как вам хотелось бы, один опасный подход будет заключаться в том, чтобы вместо обезьяны-заплатить Array.prototype
Array.prototype.toCSV = function toMediocreCSV () {
const results = this;
const headers = {};
results.forEach((result) =>
Object.keys(result).forEach((key) => headers[key] = true)
)
const keys = Object.keys(headers);
print(keys.join(","));
results.forEach((result) =>
print(keys.map((key) => result[key] != null ? result[key] : '')
.join(","))
)
}
> db.test.aggregate().toArray().toCSV()
_id,a,b,c
ObjectId("5d1a77e1688b8f1d66098375"),1,2,
ObjectId("5d1a77e1688b8f1d66098376"),3,,4
В качестве альтернативы, вы могли бы написать аналогичную функцию, которая принимает массив и форматирует его так, как вам хочется: единственное преимущество модификации прототипа - это возможность красиво склеивать вещи.