web-dev-qa-db-ja.com

Mongo C#ドライバー-フィルターが含まれています

非同期とビルダーパターンを多く使用する最新バージョンのMongoC#ドライバーを使用しています。いいですね。 SQLwhere句をMongoFilterDefinitionオブジェクトに変換しようとしています。

「含む」を処理する方法はありますか?
お気に入り:

where x contains 'ABC'
6
Mr767267

xが文字列の場合、単純な正規表現を使用してこれを行うことができます。 2.0ドライバーの場合、手動でFilterDefinitionを作成できます。

FilterDefinition<BsonDocument> filter = "{ x : { $regex : /ABC/ } }";

または、Builderを使用してフィルターを作成します。

var builder = Builders<BsonDocument>.Filter;
var filter = builder.Matches("x", "ABC");

次に、クエリでフィルタを使用できます。

using (var cursor = await collection.Find(filter).ToCursorAsync())
{
    // ...
}
5
CodeCaster

V2 APIでこれを実現するには、「Filter.Regex」を使用します。

var collection = db.GetCollection<BsonDocument>("collection");

var filter = Builders<BsonDocument>.Filter.Regex("fieldName", new BsonRegularExpression(".*fieldValue.*"));

var data = await (await coll.FindAsync<BsonDocument>(filter).ConfigureAwait(false)).ToListAsync();

//continue process data 
13
Ofir

まず、 MongoDB大学の.NETコース (Mongo自体から)を受講することを強くお勧めします。それは本当に徹底的で、あなたの質問(そしてそれ以上)を深くカバーします。

次に、あなたの例ではxが配列であると仮定します。

MongoDBは、配列を使用してポリモーフィズムを正しく処理します。 Postの配列を持つクラスTagsがある場合は、_Tag = ABC_の場所をフィルタリングできます。

C#linqメソッドを使用している場合、それは.Find(p => p.Tags == "ABC")のようになります。 BsonDocumentを使用している場合、それはnew BsonDocument().Add("Tags", "ABC")のようになります。

1
ashes999

私は好きではない別の方法がありますが、それは機能します。正解とマークされた答えは半分間違っています(一致はビルダーの方法です)。この例では、/はSQLクエリのLIKEステートメントの%のように機能します。私はまだより良い方法を探しています、そして私が以下のより等しいフィルターであるものを見つけたら更新します。

List<yourobject> someList = await collection.Find("{ x: /Test/ }").ToListAsync();

var filter = Builders<yourobject>.Filter.Eq("x", "ABC");
List<yourobject> someList = await collection.Find(filter).ToListAsync();
0
Bryce

Filter.AnyInを使用してこれを機能させることができました

var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });

これは、複数の値を探している場合にも機能します。それらをリストに追加するだけです。

0
reggaeguitar