2016-12-19 9 views
6

Mam dwie kolekcje mongo, jedną, która odnosi się do env produkcji, a druga do env. Jak porównać różnicę między dwoma z nich? Próbowałem zrzucić je do bessy, a następnie przekonwertować na jsona. Ale nie mogę po prostu wykonać prostego porównania, ponieważ sortowanie może się różnić, a plik json jest zbyt duży, aby można go było posortować.Porównaj mongo diff w dwóch kolekcjach

Odpowiedz

5

Wykonaj następujące czynności w powłoce, spowoduje to iterację każdego elementu w kolekcji i spróbuje dopasować każdy dokument na podstawie identyfikatora.

Say mamy 2 zbiory db.col1 i 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 } 

Możemy następnie utworzyć funkcję javascript, aby porównać 2 zbiory

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; 
} 

Wtedy nazywają się tak:

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

Jeśli będziemy mieli 3 kolekcje db.col3

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

I porównać ten

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

dostaniemy oczekiwanego rezultatu.

Jeśli mamy także 4th kolekcję, która ma pasujących dokumentów, ale dane rozróżnianie db.col4

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

Będzie to również powrót false

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

jest to bardzo pomocne, dziękuję! –

1

Jeśli trzeba porównać tylko podzbiór pól (np nie musisz porównywać identyfikatorów), możesz to zrobić w następujący sposób. Eksportować zbiory do csv, określając pola porównać (source):

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

A potem zrobić prosty diff na csv plików. Zwróć uwagę, że kolejność kolumn w pliku csv odpowiada opcji --field.

Plusy:

  • można określić podzbiór pól do porównania.
  • możesz zobaczyć rzeczywistą różnicę rekordów.

Wady:

  • porównać pełną dokumentację, trzeba znać wszystkie możliwe pola.
  • mongoexport może być powolny w przypadku dużych baz danych.
0

użyć Studio 3T do porównania mongodb. można porównać kolekcje, db, pojedyncze rekordy, jak również. wystarczy pobrać i podłączyć mongo. tu jest link do pobrania https://studio3t.com/

+0

Może możesz dodać link do samouczka, jak to zrobić w tym konkretnym narzędziu. – testuser

+0

Zwłaszcza, że ​​ta funkcja nie jest częścią bezpłatnej wersji (nawet "taniej" licencji), ale tylko wersji Enterprise ... Jeśli ktoś ma narzędzie, to jest link do prawdziwego samouczka: https : //studio3t.com/whats-new/diff-mongodb/? utm_source = post & utm_medium = fb & utm_campaign = 3tslpage – testuser

2

dbHash zrobił sztuczkę:

use db_name 
db.runCommand('dbHash') 

Zwraca wartości hash dla każdej kolekcji. Następnie możesz je porównać. Jest całkiem dokładny.