2017-12-27 15 views
0

非常に簡単なアルゴリズムを実装しようとしています。 単純な階層があるとしましょう: (ルート)A => B => C すべてのnoveはIDを表し、すべてのIDは多くのレコードを含んでいます。MongoDB C#ドライバ - >文字列にリストの要素(文字列)が含まれていないか確認してください。

録音は持っている: (文字列)同上と(リスト)だから我々は持つことができます

をExcludedId:

REC1:{ID:Aを、 ExcludedId = [B]}

rec2:{Id:A; ExcludedId = [D]}

rec3:{Id:A; ExcludedId = [B]}

rec1 ':{Id:A; ExcludedId = []}

REC1" :{ID:C; ExcludedId = []}

REC2' :{ID:D; ExcludedId = []}

次にアルゴリズムは次のようになります。

私はCIからレコードを取りたい場合は、取る必要があります。 C、B、Aは、IDに存在し、 C、B、A、NOTはExcludedId

に存在するだから私は書いた:

Unsupported filter: Any(value(System.Collections.Generic.List`1[System.String]).Where({document}{Id}.Contains({document}))).' 

は、あなたがそれで私を助けることができる: は、しかし、私は言う例外を受け取りますか?事前にありがとう

編集:

を変更:

Builders<Record>.Filter.Where(record => allScenarios.Any(s => record.Id.Contains(s)) 

Builders<Record>.Filter.In(ts => ts.ScenarioGuid, parentScenarioGuids), 

へそしてそれは動作します!しかし、問題があります。

Builders<Record>.Filter.Not(Builders<Record>.Filter.Where(record => allScenarios.Any(s => record.ExcludedIds.Contains(s)))) 
     ); 

ExcludedIdsはListであるため、問題があります。結果:

Builders<Record>.Filter.Nin(ts => ts.ExcludedScenarioGuids, allScenarios) 

Cannot convert lambda expression to type FieldDefinition<Records, string> because it not a delegate type. 

例外は、TS => ts.ExcludedScenarioGuids

EDIT2に指摘されて言う:@cloudikkaが書いたように、解決策はAnyNinあるような

とに。ありがとう

答えて

2

Whereメソッドの代わりにInメソッドを使用します。あるいは、Ninメソッド。どちらも単一の値フィールドに使用できます。配列フィールドにはAnyInがあり、反対にAnyNinがあります。

関連ソース:

In method

Nin method

AnyIn method

AnyNin method

+0

ありがとう!私の問題を部分的に解決しました。しかし、私は私の質問に書いたようなNinにはまだ問題があります(私は編集しました)。もう一度助けてもらえますか? –

+0

私はそれがArrayフィールドであり、その場合は[AnyNinメソッド](http://mongodb.github.io/mongo-csharp-driver/2.5/apidocs/html/M_MongoDB_Driver_FilterDefinitionBuilder_1_AnyNin__1.htm)を使用する必要があります。 – cloudikka

+0

ありがとうございます!数分前にanyNinを見つけました。しかし基本的にはあなたの答えが私を助けました。 –

関連する問題