Клонируйте коллекцию mongodb из Rails Mongoid - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь реализовать это решение в рельсах, используя collection aggregate method, для клонирования всей коллекции в одной базе данных.

В оболочке mongo это работает отлично, иклонированная коллекция успешно создана:

db.source_collection.aggregate([ { $match: {} }, { $out: "target_collection" } ])

Альтернатива rails - mongoid, согласно моим исследованиям, должна быть такой, которая работает без ошибок:

SourceCollection.collection.aggregate({"$match" => {},  "$out" => "target_collection"})
#<Mongo::Collection::View::Aggregation:0x000000055bced0 @view=#<Mongo::Collection::View:0x44951600 namespace='DB_dev.source_collection' @filter={} @options={}>, @pipeline={"$match"=>{}, "$out"=>"target_collection"}, @options={}>

Я также пытался с массивом

SourceCollection.collection.aggregate([{"$match" => {}},  {"$out" => "target_collection"}])
#<Mongo::Collection::View::Aggregation:0x000000054936d0 @view=#<Mongo::Collection::View:0x44342320 namespace='DB_dev.source_collection' @filter={} @options={}>, @pipeline=[{"$match"=>{}}, {"$out"=>"target_collection"}], @options={}>

ОБНОВЛЕНИЕ

Этот простейший синтаксис также работает в консоли Mongo:

db.source_collection.aggregate( { $out: "target_collection" } )

Но соответствующий синтаксис в Ruby не работает:

SourceCollection.collection.aggregate({"$out" => "target_collection"})

К сожалению, хотя ошибок нет, коллекция не создается.

Любые подсказкикак я могу это сделать?Mongo gem версии 2.5.3

Update2

Очевидно, что $ out не рассматривается в конвейере, что делает агрегирование недействительным.

Это может бытьисправлено с помощью кода ... Я ищу переопределение модуля / класса / метода, поскольку обращение в систему отслеживания проблем mongodb для запроса на изменение может быть не таким быстрым ..

ОБНОВЛЕНИЕ - ФИНАЛ

Эта проблема была решена с помощью Томаса Р. Колла (спасибо).

Я добавляю обновление, чтобы опубликовать ответ, полученный от службы продажи билетовMongoDB, который в значительной степени описывает решение Томаса.

Причина, по которой вы не видите результатов без count, заключается в том, что метод aggregate возвращает ленивый курсор;то есть запрос не выполняется до тех пор, пока не будет повторено возвращаемое значение aggregate.Вызов count является одним из способов сделать это.Это то же самое поведение, которое вы увидите, если позвоните find или если вы позвоните aggregate без указания $out;Разница в том, что у $out есть побочный эффект, помимо простого возврата результатов, поэтому более очевидно, когда именно это происходит.

1 Ответ

0 голосов
/ 02 июня 2018

Нашел решение, и я должен объяснить несколько моментов:

Возвращает объект Mongo :: Collection :: View :: Aggregation, он не отправляет запрос в базу данных

User.collection.aggregate({"$out": "target_collection"})

Только когда вы вызываете метод типа count или to_a для объекта агрегации, он будет отправлен на сервер, но если вы передадите хеш, вы получите ошибку, поэтому конвейер долженбыть массивом хэшей для работы

User.collection.aggregate([{"$out": "target_collection"}]).count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...