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
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
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.
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/
Może możesz dodać link do samouczka, jak to zrobić w tym konkretnym narzędziu. – testuser
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
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.
jest to bardzo pomocne, dziękuję! –