ruby mongo驱动程序动态查询结果mongo::collection的未定义方法

z6psavjg  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(243)

我希望根据用户的输入动态传递此集合名称和选项。

query = "test_collection.find.skip(2).limit(100)"
collection, options = query.split(".", 2)
   => ["test_collection", "find.skip(2).limit(100)"]
Mongo::Client.new("mongodb+srv://user:pass@clusteruri.net/testdb?w=majority&connectTimeoutMS=123") do |conn|  
 rows << conn[collection].send(options).to_a
end

mongo::collection:0x0000720的未定义方法“find.skip(2).limit(100)”

但是,当options=“find”时,这种方法可以正常工作。我认为多种选择都不起作用。尝试
行<<conn[collection].options.to_a=>空结果
行<<conn[collection].send(*选项)。to_a=>未定义的方法错误
行<<conn[collection].send(**选项)。to_a=>不将字符串隐式转换为哈希
如何动态传入链式方法>

kyks70gy

kyks70gy1#

send 需要将方法名称指定为第一个参数,并将参数指定为附加参数。它不接受包含名称、参数和所需标点符号的字符串。对于上述问题,最接近实际情况的是 eval .
然而, eval 用户输入的错误是极其危险的。例如,您可能允许用户删除您的所有数据。
您应该从用户提供的输入中解析选项,并将它们与白名单(例如 skip , limit ,如有必要,验证参数,并构造适当的调用。

相关问题