1

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'], :データベース => 'mydb')

テスト = クライアント['テスト']

doc = { "_id" => 1, "バッチ" =>10452, "tran_details" =>[ { "qty" =>200, "prate" =>50, "mrp" =>70 }, { "qty" =>250, "prate" =>50, "mrp" =>60 }, { "qty" =>190, "prate" =>55, "mrp" =>75 } ] }

test.insert_one(ドキュメント)

w3 チュートリアルで作成されたさまざまなドキュメントをすべて挿入します。

w3 チュートリアルの例 2 を見ると、翻訳された ruby​​ find は次のようになります。

test.find({"バッチ" => 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({"バッチ" => 10452}).projection({"tran_details.prate" => 1}).to_a

2 つの異なるプロジェクションの効果を組み合わせたいのですが、それをオンラインで行う方法に関するドキュメントは見たことがありません。2 つのプロジェクションを互いにつなげると、最終的なプロジェクションだけが効果を発揮します。

4

1 に答える 1

0

誰にでも――

この問題は、射影で $elemMatch を使用することにより、1 つの要素まで解決できます。ただし、$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

誰かがこれを見て、文字列からルビーでクエリを動的に構築する方法を知っているなら、私に知らせてください! bson と関係がありますが、関連するドキュメントを探しています。ありがとう -

于 2016-06-10T13:25:12.077 に答える