programing

mongo:csv 파일로 Aggregate 내보내기

closeapi 2023. 5. 1. 21:23
반응형

mongo:csv 파일로 Aggregate 내보내기

집계 결과를 csv 파일에 저장하고 싶습니다.

mongo cmd 라인 도구를 사용하여 원하는 결과를 얻을 수 있습니다.

db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}

결과를 csv로 저장하는 mongoexport 명령으로 어떻게 변환합니까?

2.6+ 시점에서 약간 더 간단한 옵션은 이제 추가하는 것입니다.$out집계 단계를 수행하여 결과를 컬렉션에 저장합니다.

db.collection.aggregate( [ { aggregation steps... }, { $out : "results" } ] )

그럼 그냥 사용하세요.mongoexport다음과 같이:

mongoexport -d database -c results -f field1,field2,etc --csv > results.csv

그런 다음 데이터베이스에서 임시 컬렉션을 삭제하여 불필요한 리소스를 계속 사용하지 않도록 하고 데이터베이스에 이 컬렉션이 존재하는 이유를 잊어버린 경우 혼란을 방지할 수 있습니다.

db.results.drop()

다음 3단계로 CSV 파일로 내보낼 수 있습니다.

  1. 집계 결과를 변수(참조)에 할당합니다.

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
    
  2. 새 컬렉션에 변수 값을 삽입합니다.

    db.bar.insert(result.toArray());
    
  3. 터미널(또는 명령줄)에서 이 막대 컬렉션을 CSV 파일로 내보냅니다.

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

...그리고 당신은 끝났습니다 :)

집계() 쿼리를 실행할 수 없습니다.mongoexport.그mongoexport도구는 전체 집계 및 데이터 처리가 아닌 쿼리 필터를 사용하여 보다 기본적인 데이터 내보내기를 위한 것입니다.하지만 MongoDB용으로 좋아하는 언어 드라이버를 사용하여 간단한 스크립트를 쉽게 작성할 수 있습니다.

결과를 컬렉션에 저장하지 않으려면 인쇄 기능을 사용하여 JavaScript에서 CSV 파일에 직접 쓸 수도 있습니다.다음 스크립트를 exportCompras.js와 같은 파일에 저장합니다.

let cursor = db.compras.aggregate({ $group : 
  { _id : "$data.proponente", 
    total : { $sum : "$price" }
  }
});

if (cursor && cursor.hasNext()) {

  //header
  print('proponente,total');

  cursor.forEach(item => {
    print('"' + item._id + '",' + item.total);
    // printjson(item); -- if you need JSON
  });
}

명령줄에서 >mongo server/collection exportCompras.js > compasResults.csv --quiet를 호출합니다.

@M에서 업데이트됨.이전의 while 루프를 대체하기 위한 저스틴의 코멘트.

다음을 가져가서 mongo 서버 어딘가에 저장합니다.

// Export to CSV function
DBCommandCursor.prototype.toCsv = function(deliminator, textQualifier) 
{
    var count = -1;
    var headers = [];
    var data = {};

    deliminator = deliminator == null ? ',' : deliminator;
    textQualifier = textQualifier == null ? '\"' : textQualifier;

    var cursor = this;

    while (cursor.hasNext()) {

        var array = new Array(cursor.next());

        count++;

        for (var index in array[0]) {
            if (headers.indexOf(index) == -1) {
                headers.push(index);
            }
        }

        for (var i = 0; i < array.length; i++) {
            for (var index in array[i]) {
                data[count + '_' + index] = array[i][index];
            }
        }
    }

    var line = '';

    for (var index in headers) {
        line += textQualifier + headers[index] + textQualifier + deliminator;
    }

    line = line.slice(0, -1);
    print(line);

    for (var i = 0; i < count + 1; i++) {

        var line = '';
        var cell = '';
        for (var j = 0; j < headers.length; j++) {
            cell = data[i + '_' + headers[j]];
            if (cell == undefined) cell = '';
            line += textQualifier + cell + textQualifier + deliminator;
        }

        line = line.slice(0, -1);
        print(line);
    }
}

그런 다음 셸 또는 로보몽고와 같은 GUI를 통해 다음 명령을 실행할 수 있습니다.

load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();

같은 논리로, 저의 경우, 저는 출력을 JSON 데이터로 out.json으로 하고 싶습니다.

1 - 서버가 아닌 로컬에 file.js만듭니다.

date = new Date("2019-09-01");
query = {x: true, 'created': {$gte: date}};
now = new Date();
userQuery = {'user.email': {$nin: [/\.dev$|@test\.com$|@testing\.com$/]}};
data = db.companies.aggregate([
    {$match: query},
    {$sort: {x: 1, created: 1}},
    {$lookup: {as: 'user', from: 'users', localField: 'creator', foreignField: '_id'}},
    {$addFields: {user: {$arrayElemAt: ['$user', 0]}}},
    {$match: userQuery},
    {$project: {"_id": 1, "name": 1, "user.email": 1, "xyz": 1}}
]).toArray();

print(JSON.stringify(data));

2-런

mongo server/collection file.js > out.json --quiet

3 - 헤더 삭제 후 체크아웃.json

[
  {
    "_id": "124564789",
    "xyz": [
      {
        "name": "x",
        "value": "1"
      },
      {
        "name": "y",
        "value": "2"
      }
    ],
    "name": "LOL",
    "user": {
      "email": "LOL@LOL.com"
    }
  },
....
....
}]

쿼리에 사용해 보십시오.

mongoexport -d DataBase_Name -c Collection_Name --type=csv --fields name,phone,email -q '{_bank:true,"bank.ifsc":{$regex:/YESB/i}}' --out report.csv

제안한 대로 내보내기를 실행하려고 했지만 csv 플래그가 사용되지 않습니다.

그래서 여기 작업 중인 스니펫이 있습니다.

mongoexport -d database_name -c collection_name -f field1,field_2 --type=csv > results.csv

선택적으로 다음과 같은 필터를 추가할 수 있습니다.

mongoexport -h 0.0.0.0 -d database_name -c collection_name --query '{"$or": [{"condition_one": true},{"condition_two": true}]}' --type=csv --fields "field1,field_2" > out.csv

언급URL : https://stackoverflow.com/questions/16468602/mongoexport-aggregate-export-to-a-csv-file

반응형