我正在尝试使用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
有副作用 不仅仅是返回结果,所以它确切地说更明显 它发生了。
答案 0 :(得分:1)
找到解决方案,我必须解释一些问题:
这会返回一个Mongo :: Collection :: View :: Aggregation对象,它不会向数据库发送查询
User.collection.aggregate({"$out": "target_collection"})
只有在聚合对象上调用类似count
或to_a
的方法时才会将其发送到服务器,但如果传递散列,则会出现错误,因此管道已经成为一系列哈希工作
User.collection.aggregate([{"$out": "target_collection"}]).count