Ruby Mongo Driver Projection Elemmatch

时间:2016-06-08 16:55:00

标签: ruby-on-rails ruby mongodb mongodb-query mongodb-ruby

按照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

我想结合两种不同预测的效果,但我还没有看到任何关于如何在线进行此操作的文档。如果将两个投影相互串联,则只有最终投影才有效。

1 个答案:

答案 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有关但仍在努力寻找相关文档。谢谢 -