C#の投影で$ MAPと$フィルタ - コード例 -- c# フィールド と mongodb フィールド と aggregation-framework フィールド と mongodb-.net-driver フィールド 関連 問題

$map and $filter in a projection on C# - code example












0
vote

問題

日本語

C#MongoDBドライバのネイティブ関数を使用して集計フレームワークの$ MAPと$ FILTERオプションを使用したい。

それをする方法はありますか?もしそうなら、あなたはいくつかのコード例を置くことができますか?

Mongo DBの公式文書を検索しましたが、何も見つかりませんでした。

次のコードはMongoシェルスクリプトにあり、C#MongoDBドライバに翻訳したいです。

 <コード> var pipeline =  [     {         $match:{             ExId: {$in: [ObjectId('5d112f91cb865c02b0714d56'), ObjectId("5d168d2c305196e45e73f4a7")]}         }     },     {         $project:{             ExId: 1,             ArrayObject: {                 $map:{                     'input': '$ArrayObject',                     'as': 'itemA',                     'in':{                         'Name': '$$itemA.Name',                         'FilterHere': {                             $filter: {                                 input: '$$itemA.FilterHere',                                 as: 'item',                                 cond: {                                     $eq: ['$$item.Sent', true]                                 }                             }                         }                     }                                         }             }         }     } ]  db.getCollection('MyColection').aggregate(pipeline)   

次の出力をC#オブジェクトに予想しています。

 <コード> {     "_id" : ObjectId("5d444527cb865d28e8572d8d"),     "ExId" : ObjectId("5d112f91cb865c02b0714d56"),     "ArrayObject" : [          {             "Name" : 130774,             "FilterHere" : [                  {                     "Code" : 15900181,                     "SentDate" : ISODate("2019-08-02T11:13:11.732Z"),                     "Sent" : true                 },                  {                     "Code" : 15900184,                     "SentDate" : ISODate("2019-08-02T11:13:11.735Z"),                     "Sent" : true                 }             ]         }     ] }   

ありがとう。

英語

I want to use $map and $filter option of aggregation framework utilizing C# mongodb driver native functions.

Is there any way to do that? If yes can you put some code examples please?

I searched the official documentation of Mongo DB but found nothing.

The following code is in mongo shell script and I want to translate to C# mongodb driver.

var pipeline =  [     {         $match:{             ExId: {$in: [ObjectId('5d112f91cb865c02b0714d56'), ObjectId("5d168d2c305196e45e73f4a7")]}         }     },     {         $project:{             ExId: 1,             ArrayObject: {                 $map:{                     'input': '$ArrayObject',                     'as': 'itemA',                     'in':{                         'Name': '$$itemA.Name',                         'FilterHere': {                             $filter: {                                 input: '$$itemA.FilterHere',                                 as: 'item',                                 cond: {                                     $eq: ['$$item.Sent', true]                                 }                             }                         }                     }                                         }             }         }     } ]  db.getCollection('MyColection').aggregate(pipeline) 

I expect the following output into a C# object:

{     "_id" : ObjectId("5d444527cb865d28e8572d8d"),     "ExId" : ObjectId("5d112f91cb865c02b0714d56"),     "ArrayObject" : [          {             "Name" : 130774,             "FilterHere" : [                  {                     "Code" : 15900181,                     "SentDate" : ISODate("2019-08-02T11:13:11.732Z"),                     "Sent" : true                 },                  {                     "Code" : 15900184,                     "SentDate" : ISODate("2019-08-02T11:13:11.735Z"),                     "Sent" : true                 }             ]         }     ] } 

Thanks.

</div
           

回答リスト

3
 
vote
vote
ベストアンサー
 

MongoDB C#ドライバ集約ドキュメントここ。 C#ドライバで集約パイプラインを作成するには、3つのオプションがあります。

  1. LINQを使用して集約することができますが、LINQとMongoクエリ言語の間の1:1マッピングは常に1:1のマッピングではありません。
  2. ドライバ固有の<コード> Builder クラスを使用できます。
  3. BsonDocument ビルダーを使用して「RAW」集約を作成できます。この方法を使用して、限られた安全性がありません。
  4. 最初の2つのオプションでは、コンパイラがタイプの安全性を強制するため、適切なクラスを作成する必要があります。

    オプション3に提供する集約の「生の」変換は、少し冗長であるとはかなり簡単です。

    <事前> <コード> var foo = new BsonDocument("$project", new BsonDocument("ExId", 1).Add("ArrayObject", new BsonDocument("$map", new BsonDocument("input", "$ArrayObject").Add("as", "itemA").Add("in", new BsonDocument("Name", "$$itemA.Name").Add("$filter", new BsonDocument("input", "$$itemA.FilterHere").Add("as", "item").Add("cond", new BsonDocument("$eq", new BsonArray().Add("$$item.Sent").Add(true))))))));

    残念ながら、あなたの入力クラスがどのように見えるかわからないので、パイプラインをコードに直接翻訳するのは難しいです。しかし、式のドキュメント、それ .Where は、 .Where に使用されている 9988777663 が使用されているように表示されます。これは意味があるでしょう、あなたのコードは

    のように見えます <事前> <コード> col.Aggregate() .Match(doc => ids.Contains(doc.ExId)) .Project(doc => new { ExId = doc.ExId, ArrayObject = doc.ArrayObject.Select(x => new { Name = x.Name, FilterHere = x.FilterHere.Where(y => y.Sent == true) }) });

    私はあなたの実際のクラスを持っていないので、私は彼らがどのように見えるものを本当に推測することができました、 StartObject は私の最善の推測です。

 

You can find the MongoDB C# Driver Aggregation Documentation here. For constructing an aggregation pipeline in the C# Driver, you have 3 options.

  1. You can use LINQ to aggregate however there aren't always 1:1 mappings between LINQ and the Mongo Query Language.
  2. You can use the driver specific Builder class.
  3. You can use the BsonDocument builders to construct a "raw" aggregation. There is limited, or no type safety using this method.

The first 2 options require that you create the appropriate classes as the compiler will enforce type safety.

The "raw" conversion of the aggregation you provided to option 3 is fairly straightforward, albeit a little verbose.

var foo = new BsonDocument("$project", new BsonDocument("ExId", 1).Add("ArrayObject",     new BsonDocument("$map",         new BsonDocument("input", "$ArrayObject").Add("as", "itemA").Add("in",             new BsonDocument("Name", "$$itemA.Name").Add("$filter",                 new BsonDocument("input", "$$itemA.FilterHere").Add("as", "item").Add("cond",                     new BsonDocument("$eq", new BsonArray().Add("$$item.Sent").Add(true)))))))); 

Unfortunately, since I don't know what your input classes look like, it is hard for me to directly translate your pipeline into code. However, looking at the Expressions Documentation, it appears that $map is used for .Select LINQ and $filter is used for .Where LINQ. This would mean, your code looks something like

col.Aggregate() .Match(doc => ids.Contains(doc.ExId)) .Project(doc =>      new {         ExId = doc.ExId,         ArrayObject = doc.ArrayObject.Select(x =>             new             {                 Name = x.Name,                 FilterHere = x.FilterHere.Where(y => y.Sent == true)             })         }); 

Since I don't have your actual classes, I could only really guess what they look like, StartObject is my best guess.

</div
 
 

関連する質問

9  MongoDB C#ドライバを使用する親子階層からノードを検索して更新する  ( Using mongodb c sharp driver find and update a node from parent children hierarc ) 
親子 - 子供などのような階層的なカテゴリ文書を持っています.... <事前> <コード> { id: 1, value: { }Children: [{ id: 2, value: { ...

1  MongoDB C#ドライバは増加更新の値を取得します  ( Mongodb c sharp driver retrieve value of increment update ) 
次のINCステートメントを更新してフィールドの値を増やす <事前> <コード> var update = Updates.Inc(x => x.Version, 1); await collection.FindAndUpdateOneAsync(myQu...

0  MongoDB文書について  ( About mongodb documents ) 
私はNoSQL / MongoDBの世界に慣れているので、いくつかのことを試しています。 MongoDBを使ってブログを作成したいとしましょう。 このようなブログ投稿を作成することができます: <事前> <コード> { Title: "My Firs...

1  MongoDB C#ドライバ(バージョン2)を使用してネストした基準を検索する方法  ( How do i search nested criteria using mongodb c sharp driver version 2 ) 
カテゴリにグループ化された基準を含むことができる文書の集まりを持っています。構造は次のようになります。 <事前> <コード> { "Name": "MyDoc", "Criteria" : [ { ...

66  MongoDB接続のための.NETのベストプラクティス?  ( Net best practices for mongodb connections ) 
最近Mongodbで遊んでいます(それは驚くほど速い)GithubのC#ドライバーを使っています。私がテストしている私の小さなシングルスレッドコンソールアプリでは、すべてがうまく機能しています。シングルスレッドを実行している8秒以内に1,000,000ドキュメ...

1  動的LINQと流暢なMongoを使用する場合の複数の値によるグループ化により、不正なマップreduce emitステートメントが発生します。  ( Grouping by multiple values when using dynamic linq and fluent mongo causes a ma ) 
動的リンクを使用してMapReduceクエリを実行し、複数の値でグループ化しようとしているときに問題になっています。これをチェックしてください: これはうまく機能します: var query = ContentDeliveryAggrespates.AsQu...

0  C#MongoDBの配列の並べ替えと制限  ( C sharp mongodb array sort and limit ) 
文書内のデータをソートし、その一部のみを取得する方法はありますか? 例えば: <事前> <コード> public class PingPong { //some other data except Ranks //... //... ...

6  MongoDB C#API V2:replaceoneとfindoneandreplaceの違い  ( Mongodb c sharp api v2 difference between replaceone and findoneandreplace ) 
MongoDBの資料を探しているI FientOneanDreplaceがアトミック操作になることを読みました。しかし、私が理解していないのは、replicetOneは原子的ではないでしょうか。そして違いがあるならば、なぜreplaceOneを使用するべきで...

1  MongoDB:C#またはJavaScript?  ( Mongodb c sharp or javascript ) 
私はMongoDBと働くのが深くない。しかし、私はそれをC#ドライバーと一緒に使いたいです。私はこのドライバですべての機能が利用できるわけではないと思います(私は正しいですか?)。または、例えばJavaScriptに書かれたコードを簡単に見つけることが簡単で、...

0  Web API + MongoDB:任意のオブジェクトのリスト?  ( Web api mongodb list of arbitrary objects ) 
私はMongoDB .NETドライバを使用している.NET Core 2.0 Web APIを持っています。 ListOfValues :というクラスがあります。 <事前> <コード> public class ListOfValues { pub...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有