Статьи

Переместить документы из MongoDB в Couchbase

Возможно, вы помните мой пост о переносе данных из CouchDB в Couchbase . Если вы используете не CouchDB, а MongoDB, возможно, вы подвели. Я прошу прощения. Давайте это исправим. Вот как перенести ваши данные из MongoDB в Couchbase.

Одной из замечательных особенностей использования RxJava является то, что этот API становится все более распространенным. Мы сделали такой выбор некоторое время назад и рады видеть, что в этот вагон приходит больше людей, как это сделал Монго в последнее время.

Тот факт, что мы совместно используем потоковый API, сделает все очень просто. Моя цель — получить документ Observable of Mongo , сопоставить его с документами Couchbase, а затем записать их в Couchbase. Как видите, этот процесс действительно легко моделировать с помощью RxJava. В псевдокоде это будет выглядеть так:

getMongoCollectionStream (). fromMongoDocumentToCouchbaseDocuments (). writeCBdocToCouchbase ()

Опять же, это очень хорошо сочетается с RxJava.

MongoDB позволяет открывать коллекцию и возвращать ее в качестве наблюдаемого документа. Это именно то, что нам нужно и может произойти в несколько строк:

    MongoClient client = MongoClients.create(connectionString);
    MongoDatabase db = client.getDatabase(dbName);
    Observable<org.bson.Document> mongoDocs = db.getCollection(collectionName).find();

Затем нам нужно преобразовать документы, поступающие в документы Couchbase. Мы можем легко использовать оператор карты Rx для этого. При написании документа на couchbase вам нужен ключ или идентификатор. В документе Mongo он хранится в поле _id с использованием абстракции ObjectID. Он генерируется Монго на основе нескольких критериев. Как только мы получим этот идентификатор, все, что нам нужно сделать, это получить документ в виде строки JSON и создать RawJsonDocument на основе этого и идентификатора.

 db.getCollection(collectionName).find().toObservable()
                .map(new Func1<org.bson.Document, Document>() {
                    public Document call(org.bson.Document mongoDoc) {
                        mongoDoc.put(typeField, type);
                        RawJsonDocument d = RawJsonDocument.create(mongoDoc
                                .getObjectId("_id").toHexString(), mongoDoc
                                .toJson());
                        return d;
                    };
                });

После этого map.operation мы остаемся с заметным документом couchbase. Последний шаг — написать это на Couchbase.

db.getCollection(collectionName).find().toObservable()
                .map(new Func1<org.bson.Document, Document>() {
                    public Document call(org.bson.Document mongoDoc) {
                        mongoDoc.put(typeField, type);
                        RawJsonDocument d = RawJsonDocument.create(mongoDoc
                                .getObjectId("_id").toHexString(), mongoDoc
                                .toJson());
                        return d;
                    };
                }).map(asyncBucket.upsert(doc));;

Я включил весь этот код и сделал его настраиваемым в couchbase-java-importer. Это доступно на Github здесь .

Если вам не нужно ничего делать, кроме импорта документов JSON из коллекции прямо в Couchbase, этого должно быть достаточно. Просто скачайте двоичный файл и выполните его, убедившись, что файл конфигурации yml находится в вашем classpath и содержит правильную информацию.

Это один из конкретных способов перемещения данных из MongoDB в Couchbase. Есть и другие. Например, обе базы данных поддерживают импорт CSV, а Mongo имеет экспортер CSV. Итак, когда у вас есть файл CSV, вы можете использовать cbtransfer или couchbase-java-importer, чтобы получить его содержимое в Couchbase.

Все эти примеры предполагают, что вы не хотите выполнять какие-либо преобразования данных перед их импортом. Пошаговое преобразование было бы очень просто включить в импортер RxJava. Код очень прост, поэтому, пожалуйста, не стесняйтесь его раскошелиться или отправить запросы на извлечение! Добавление большего количества импортеров в этот проект может быть отличным способом войти в сообщество CB.