按照http://www.w3resource.com/mongodb/mongodb-elemmatch-projection-operators.php中的代码,我使用 ruby mongodb 驱动程序建立了一个测试数据库。
对于那些在家跟随的人,您首先需要按照https://docs.mongodb.com/ecosystem/tutorial/ruby-driver-tutorial/#creating-a-client中的说明安装 mongo 驱动程序,然后运行以下命令.
客户端 = Mongo::Client.new([ '127.0.0.1:27017'], :database => 'mydb')
测试=客户端['测试']
doc = { "_id" => 1, "batch" =>10452, "tran_details" =>[ { "qty" =>200, "prate" =>50, "mrp" =>70 }, { "qty" =>250, "prate" =>50, "mrp" =>60 }, { "qty" =>190, "prate" =>55, "mrp" =>75 } ] }
test.insert_one(doc)
插入在 w3 教程中创建的所有不同文档。
如果您查看 w3 教程中的示例 2,翻译后的 ruby find 是:
test.find({"batch" => 10452}).projection({"tran_details" => {"$elemMatch" => {"prate" => 50, "mrp" => {"$gte" => 70 }}}}).to_a
它返回与示例中相同的结果。
=> [{"_id"=>1, "tran_details"=>[{"qty"=>200, "prate"=>50, "mrp"=>70}]}, {"_id"=>3} , {"_id"=>4}]
我的问题是我想用上面的约束(mrp gte 70 等)约束结果,同时还指定返回哪些字段。
例如,仅约束具有 mrp gte 70 的 tran_details,但在返回的结果中仅包含 prate 字段(或字段的任何子集)。
我只能使用查询返回 prate 字段:
test.find({"batch" => 10452}).projection({"tran_details.prate" => 1}).to_a
我想将两种不同投影的效果结合起来,但我还没有看到任何关于如何在网上做到这一点的文档。如果将两个投影串在一起,则只有最终的投影有效果。