从Rails Mongoid

时间:2018-06-01 12:29:38

标签: ruby-on-rails mongodb

我正在尝试使用collection aggregate method在rails中实现this solution来克隆同一数据库中的整个集合。

在mongo shell中,这非常有效,并且成功创建了克隆集合:

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问题跟踪系统的变更请求可能不会那么快..

更新 - 最终

在Thomas R. Koll(谢谢)的帮助下,这个问题已经已解决

我添加了一个更新来发布我从MongoDB的票务服务获得的响应,这几乎描述了Thomas的解决方案。

  

没有count你没有看到结果的原因是   aggregate方法返回一个惰性游标;也就是说,查询没有   执行直到迭代aggregate的返回值。   调用count是实现此目的的一种方法。这是相同的行为   您会看到是否致电find,或者是否在没有致电aggregate的情况下致电{1}}   指定$out;区别在于$out有副作用   不仅仅是返回结果,所以它确切地说更明显   它发生了。

1 个答案:

答案 0 :(得分:1)

找到解决方案,我必须解释一些问题:

这会返回一个Mongo :: Collection :: View :: Aggregation对象,它不会向数据库发送查询

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

只有在聚合对象上调用类似countto_a的方法时才会将其发送到服务器,但如果传递散列,则会出现错误,因此管道已经成为一系列哈希工作

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