MongoDB совокупный экспорт в CSV - PullRequest
1 голос
/ 01 июля 2019

Я смотрел на эту тему: Монгроэкспортный агрегатный экспорт в CSV-файл

и я смог использовать предложенный .toCsv() с db.collection.find() но я не могу использовать его с db.collection.aggregate().toCsv()

Это дает мне ошибку:

TypeError: ... toCsv () не является функцией. Детали: $ (оболочка): 1: 1

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Сценарий, который вы используете, - это 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

В качестве альтернативы, вы могли бы написать аналогичную функцию, которая принимает массив и форматирует его так, как вам хочется: единственное преимущество модификации прототипа - это возможность красиво склеивать вещи.

0 голосов
/ 01 июля 2019

Привет, команда mongo сообщает вам, что toCVS

я предпочитаю следующее решение: 1003 *

var result = db.compras.aggregate()

затем вы помещаете свой результат в коллекцию

db.agr.insert(result.result);

использование монгоэкспорт

mongoexport -d yourdbname -c agr -f _id,total --csv > results.csv
...