按照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 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
我想结合两种不同预测的效果,但我还没有看到任何关于如何在线进行此操作的文档。如果将两个投影相互串联,则只有最终投影才有效。
答案 0 :(得分:0)
对那里的任何人 -
通过在投影上使用$ elemMatch,可以解决最多一个元素的问题。但是,$ elemMatch仅返回找到的第一个结果。要仅返回符合特定条件的多层嵌入文档的部分内容,您需要使用聚合框架。
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
要仅返回符合特定条件的多层嵌入式文档的部分内容,您需要使用聚合框架。
以下是示例代码
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有关但仍在努力寻找相关文档。谢谢 -