programing

두 컬렉션의 mongo diff 비교

starjava 2023. 6. 21. 22:00
반응형

두 컬렉션의 mongo diff 비교

저는 두 개의 몽고 컬렉션을 가지고 있는데, 하나는 생산 환경을 의미하고 다른 하나는 테스트 환경을 의미합니다.

두 컬렉션의 차이점을 어떻게 비교할 수 있습니까?

저는 그것들을 아들에게 버리고 나서 아들로 바꾸려고 했습니다.하지만 정렬이 다를 수 있고 json 파일이 너무 커서 정렬할 수 없기 때문에 단순한 디프를 수행할 수 없습니다.

셸에서 다음을 시도하면 컬렉션 내의 각 항목을 반복하고 ID를 기준으로 각 문서를 일치시킵니다.

컬렉션이 두 개 있다고 가정해 보세요.db.col1그리고.db.col2:

> db.col1.find()
{ "_id" : 1, "item" : 1 }
{ "_id" : 2, "item" : 2 }
{ "_id" : 3, "item" : 3 }
{ "_id" : 4, "item" : 4 }

> db.col2.find()
{ "_id" : 1, "item" : 1 }
{ "_id" : 2, "item" : 2 }
{ "_id" : 3, "item" : 3 }
{ "_id" : 4, "item" : 4 }

그런 다음 자바스크립트 함수를 만들어 두 컬렉션을 비교할 수 있습니다.

function compareCollection(col1, col2){
    if(col1.count() !== col2.count()){
        return false;
    }

    var same = true;

    var compared = col1.find().forEach(function(doc1){
        var doc2 = col2.findOne({_id: doc1._id});

        same = same && JSON.stringify(doc1)==JSON.stringify(doc2);
    });

    return same;
}

그러면 통화는 다음과 같습니다.

> compareCollection(db.col1, db.col2)
true

만약 우리가 세 번째 컬렉션을 가지고 있다면,db.col3

> db.col3.find()
{ "_id" : 1, "item" : 1 }

그리고 이것을 비교해 보세요.

> compareCollection(db.col1, db.col3)
false

우리는 기대했던 결과를 얻을 것입니다.

데이터가 4차 , 일치번는문있데요 4째컬있다면도렉.db.col4

> db.col4.find()
{ "_id" : 1, "item" : 10 }
{ "_id" : 2, "item" : 2 }
{ "_id" : 3, "item" : 3 }
{ "_id" : 4, "item" : 4 }

" 또반됩다니환이한다니됩"를합니다.false

> compareCollection(db.col1, db.col4)
false

하는 중Mongo 4.4집계 프레임워크는 두 컬렉션(두 컬렉션에서 단일 결과 세트로 결합된 파이프라인 결과)의 결합을 수행하는 새로운 단계를 제공합니다.

두 컬렉션 간의 차이를 훨씬 쉽게 찾을 수 있습니다.

// > db.test.find()
//    { "a" : 9, "b" : 2  }
//    { "a" : 4, "b" : 12 }
//    { "a" : 3, "b" : 5  }
//    { "a" : 0, "b" : 7  }
//    { "a" : 7, "b" : 12 }
// > db.prod.find()
//    { "a" : 3, "b" : 5  }
//    { "a" : 4, "b" : 12 }
//    { "a" : 3, "b" : 5  }
//    { "a" : 0, "b" : 7  }
db.test.aggregate(
  { $unset: "_id" },
  { $project: { from: "test", doc: "$$ROOT" } },
  { $unionWith: {
      coll: "prod",
      pipeline: [
        { $unset: "_id" },
        { $project: { from: "prod", doc: "$$ROOT" } }
      ]
  }},
  { $group: {
      _id: "$doc",
      test: { $sum: { $cond: [ { $eq: ["$from", "test"] }, 1, 0 ] } },
      prod: { $sum: { $cond: [ { $eq: ["$from", "prod"] }, 1, 0 ] } }
  }},
  { $match: { $expr: { $ne: ["$test", "$prod"] } } }
)
// { "_id" : { "a" : 7, "b" : 12 }, "test" : 1, "prod" : 0 }
// { "_id" : { "a" : 9, "b" : 2  }, "test" : 1, "prod" : 0 }
// { "_id" : { "a" : 3, "b" : 5  }, "test" : 1, "prod" : 2 }

다음 항목:

  • $unset_id에 할 수 $group고려하지 않고 자체적으로 문서를 작성된 문서_id(다른 컬렉션에서는 다를 수 있음).
  • $project from입니까?test또는prod), 두할 때 의 순서로, 후자의 경우 두 컬렉션을 병합할 때 문서의 출처를 추적할 수 있습니다.
  • 도.$project doc(변수 덕분에) 문서 자체의 값입니다.다음에 사용할 필드입니다.$group서류 일체
  • $unionWith그자리의 prod두 컬렉션의 문서를 동일한 집계 파이프라인으로 병합하기 위한 컬렉션입니다.pipeline 변수는입니다.prod문서를 다운스트림 파이프라인에 삽입하기 전에 를 누릅니다.그리고 우리는 같은 것을 적용하고 있습니다.$unset/$project우리가 신청한 무대들test문서.
  • $groups test그리고.proddoc실제 문서를 나타내기 위해 만든 필드입니다. 우리는 두 의 분야를 합니다.test그리고.prod▁the로서$sum(count) 하나 또는 다른 컬렉션에서 발생한 그룹화된 문서(를 통해)$cond표현하는 경우).
  • $matches 테스트 및 prod 문서 수가 동일하지 않은 항목만 유지하여 그룹화된 요소를 생성합니다. 즉, 두 컬렉션 간의 실제 차이입니다.

dbHash가 성공했습니다.

use db_name
db.runCommand('dbHash')

각 컬렉션의 해시 값을 반환합니다.그런 다음 비교할 수 있습니다.꽤 정확합니다.

케빈 스미스 응답을 사용하여, 나는 새로운 버전을 가지고 있습니다. 단지 비교하고 반환하기 위한 것입니다.collectionB와 비교할 필요가 없습니다.collectionA그리고 결과를 저장합니다.collectionC당신이 많은 기록을 가지고 있을 때.

    db.collectionA.find().forEach(function(doc1){
        var doc2 = db.collectionB.findOne({_id: doc1._id});
        if (!(doc2)) {
                db.collectionC.insert(doc1);
        }
    });

필드의 하위 집합만 비교해야 하는 경우(예: ID를 비교할 필요가 없는 경우) 다음과 같은 방법으로 비교할 수 있습니다.비교할 필드(소스)를 지정하여 수집을 csv로 내보냅니다.

mongoexport -d <db_name> -c <col_name> --fields "field1,field2" --type=csv | sort > export.csv

그런 다음 간단한 작업을 수행합니다.diffcsv 파일에 있습니다.csv 파일의 열 순서는 다음과 같습니다.--field선택.

찬성:

  • 비교할 필드의 하위 집합을 지정할 수 있습니다.
  • 당신은 기록의 실제 차이를 볼 수 있습니다.

단점:

  • 전체 레코드를 비교하려면 가능한 모든 필드를 알아야 합니다.
  • mongoexport대용량 데이터베이스의 경우 속도가 느릴 수 있습니다.

집합에 있는 모든 문서의 모든 필드를 가져오려면 다음 답변을 참조하십시오.

mongoexport이제는--sort옵션:

예:

$ mongo
test> db.coll.insertMany([
  { _id: 0, name: 'Alex' },
  { _id: 1, name: 'Bart' },
  { _id: 2, name: 'Maria' },
  { _id: 3, name: 'Aristotle' },
]);
{
  "acknowledged": true,
  "insertedIds": [
    0,
    1,
    2,
    3
  ]
}

내보내기:

mongoexport -d test -c coll --sort "{name: 1}"
2018-10-25T15:50:07.210+0300    connected to: localhost
{"_id":0.0,"name":"Alex"}
{"_id":3.0,"name":"Aristotle"}
{"_id":1.0,"name":"Bart"}
{"_id":2.0,"name":"Maria"}
2018-10-25T15:50:07.210+0300    exported 4 records

mongoexport -d test -c coll --sort "{name: -1}"
2018-10-25T15:49:42.010+0300    connected to: localhost
{"_id":2.0,"name":"Maria"}
{"_id":1.0,"name":"Bart"}
{"_id":3.0,"name":"Aristotle"}
{"_id":0.0,"name":"Alex"}
2018-10-25T15:49:42.011+0300    exported 4 records

컬렉션을 내보낸 후 다음 작업을 수행할 수 있습니다.diffBeyond Compare와 같은 GUI(그래픽 사용자 인터페이스) 도구를 사용할 수 있습니다.

한 데이터를 다른 데이터를 있는 : 문의데는같다경른우참만._id설정:제외할 수 있습니다._id다음과 같이 내보낼 때 필드: https://stackoverflow.com/a/49895549/728287

Studio 3T를 사용하여 mongodb를 비교합니다.컬렉션, DB, 단일 레코드도 비교할 수 있습니다.당신은 mongo를 다운로드하고 연결하기만 하면 됩니다.여기는 다운로드 링크 https://studio3t.com/ 입니다.

언급URL : https://stackoverflow.com/questions/41222805/compare-a-mongo-diff-on-two-collections

반응형