Ruby Mongo Driver Projection Elemmatch
Ruby Mongo Driver Projection Elemmatch
按照 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 驱动程序,然后 运行 以下命令。
client = Mongo::Client.new([ '127.0.0.1:27017'], :database => 'mydb')
test = client['test']
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 发现是:
test.find({"batch" => 10452}).projection({"tran_details" => {"$elemMatch" => {"prate" => 50, "mrp" => {"$gte" => 70}}}}).to_a
其中 return 与示例中的结果相同。
=> [{"_id"=>1, "tran_details"=>[{"qty"=>200, "prate"=>50, "mrp"=> 70}]}, {"_id"=>3}, {"_id"=>4}]
我的问题是我想用上面的约束(mrp gte 70 等)来约束结果,同时还指定哪些字段是 returned。
例如,仅约束具有 mrp gte 70 的 tran_details,但在结果中 returned 仅包含 prate 字段(或字段的任何子集)。
我只能 return 查询的 prate 字段:
test.find({"batch" => 10452}).projection({"tran_details.prate" => 1}).to_a
我想结合两种不同投影的效果,但我还没有在网上看到任何关于如何做到这一点的文档。如果将两个投影串在一起,则只有最终投影有影响。
致所有在场的人 --
在投影上使用 $elemMatch 最多可以解决一个元素的问题。但是,$elemMatch 仅 returns 找到的第一个结果。要 return 只有符合特定条件的多层向下嵌入文档的部分,您需要使用聚合框架。
test.find({
'tran_details.prate' => { '$gt' => 56 }
}).projection({
tran_details: {
'$elemMatch' => {
prate: { '$gt' => 56 }
}
},
'tran_details.qty' => 1,
'tran_details.mrp' => 1,
batch: 1,
_id: 0
}).to_a
对于return只有符合特定条件的多层向下嵌入文档的部分,您需要使用聚合框架。
这是示例代码
test.aggregate([{
'$match': {
'$or': [
{'batch': 10452}, {'batch': 73292}]}},
{'$project':
{trans_details:
{'$filter': {
input: '$tran_details',
as: 'item',
cond: {'$and':[
{'$gte' => ['$$item.prate', 51]},
{'gt' => ['$$item.prate', 53]}
]}
}
}
}
}]).to_a
如果有人看到这个并且知道如何从字符串动态构建 ruby 中的查询,请告诉我!与 bson 有关,但仍在尝试查找相关文档。谢谢 -
按照 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 驱动程序,然后 运行 以下命令。
client = Mongo::Client.new([ '127.0.0.1:27017'], :database => 'mydb')
test = client['test']
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 发现是:
test.find({"batch" => 10452}).projection({"tran_details" => {"$elemMatch" => {"prate" => 50, "mrp" => {"$gte" => 70}}}}).to_a
其中 return 与示例中的结果相同。
=> [{"_id"=>1, "tran_details"=>[{"qty"=>200, "prate"=>50, "mrp"=> 70}]}, {"_id"=>3}, {"_id"=>4}]
我的问题是我想用上面的约束(mrp gte 70 等)来约束结果,同时还指定哪些字段是 returned。
例如,仅约束具有 mrp gte 70 的 tran_details,但在结果中 returned 仅包含 prate 字段(或字段的任何子集)。
我只能 return 查询的 prate 字段:
test.find({"batch" => 10452}).projection({"tran_details.prate" => 1}).to_a
我想结合两种不同投影的效果,但我还没有在网上看到任何关于如何做到这一点的文档。如果将两个投影串在一起,则只有最终投影有影响。
致所有在场的人 --
在投影上使用 $elemMatch 最多可以解决一个元素的问题。但是,$elemMatch 仅 returns 找到的第一个结果。要 return 只有符合特定条件的多层向下嵌入文档的部分,您需要使用聚合框架。
test.find({
'tran_details.prate' => { '$gt' => 56 }
}).projection({
tran_details: {
'$elemMatch' => {
prate: { '$gt' => 56 }
}
},
'tran_details.qty' => 1,
'tran_details.mrp' => 1,
batch: 1,
_id: 0
}).to_a
对于return只有符合特定条件的多层向下嵌入文档的部分,您需要使用聚合框架。
这是示例代码
test.aggregate([{
'$match': {
'$or': [
{'batch': 10452}, {'batch': 73292}]}},
{'$project':
{trans_details:
{'$filter': {
input: '$tran_details',
as: 'item',
cond: {'$and':[
{'$gte' => ['$$item.prate', 51]},
{'gt' => ['$$item.prate', 53]}
]}
}
}
}
}]).to_a
如果有人看到这个并且知道如何从字符串动态构建 ruby 中的查询,请告诉我!与 bson 有关,但仍在尝试查找相关文档。谢谢 -