2016-12-19 3 views
6

У меня есть две коллекции mongo, одна из которых относится к производственной env, а другая к тестированию env. Как сравнить разницу между двумя из них? Я попытался сбросить их до бсонов, а затем перешел к json. Но я не могу просто выполнить простой diff, потому что сортировка может отличаться, и файл json слишком велик для сортировки.Сравните mongo diff на две коллекции

ответ

5

Попробуйте следующее в оболочке, оно будет перебирать каждый элемент в коллекции и попытаться сопоставить каждый документ на основе идентификатора.

Скажет, у нас есть 2 коллекции 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 } 

Затем мы можем создать яваскрипт функцию для сравнения 2 коллекции

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 

Если у нас есть 3 коллекции db.col3

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

И сравните это один

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

мы получим ожидаемый результат.

Если у нас есть 4-ый сборник, который имеет соответствующие документы, но diffrent данные 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 
+0

Это очень полезно, спасибо! –

1

Если вам нужно сравнить только подмножество полей (например, вам не нужно сравнивать идентификаторы), вы можете сделать это следующим образом. Экспорт коллекции CSV, с указанием полей для сравнения (source):

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

А затем сделать простой diff на CSV-файлов. Обратите внимание, что порядок столбцов в файле csv соответствует опции --field.

Плюсы:

  • можно указать подмножество полей для сравнения.
  • вы можете видеть фактический разброс записей.

Минусы:

  • для сравнения полные записи, вы должны знать все возможные поля.
  • mongoexport может быть медленным для огромных баз данных.
0

использование Studio 3T для сравнения mongodb. вы можете сравнить коллекции, db, одиночные записи. просто вам нужно скачать и подключить монго. здесь ссылка на https://studio3t.com/

+0

Возможно, вы можете добавить ссылку на какой-то учебник о том, как это сделать в этом конкретном инструменте. – testuser

+0

Тем более, что эта функция не является частью бесплатной версии (даже не «дешевой» лицензии), а только Enterprise Edition ... Если у кого-то есть инструмент, вот ссылка на настоящий учебник: https : //studio3t.com/whats-new/diff-mongodb/ utm_source = пост & utm_medium = фб & utm_campaign = 3tslpage – testuser

2

dbHash сделал трюк:

use db_name 
db.runCommand('dbHash') 

Он возвращает хэш-значения для каждой коллекции. Затем вы можете сравнить их. Это довольно точно.

Смежные вопросы