Я пытаюсь реализовать это решение в рельсах, используя 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
есть побочный эффект, помимо простого возврата результатов, поэтому более очевидно, когда именно это происходит.