非同期とビルダーパターンを多く使用する最新バージョンのMongoC#ドライバーを使用しています。いいですね。 SQLwhere句をMongoFilterDefinitionオブジェクトに変換しようとしています。
「含む」を処理する方法はありますか?
お気に入り:
where x contains 'ABC'
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())
{
// ...
}
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
まず、 MongoDB大学の.NETコース (Mongo自体から)を受講することを強くお勧めします。それは本当に徹底的で、あなたの質問(そしてそれ以上)を深くカバーします。
次に、あなたの例ではx
が配列であると仮定します。
MongoDBは、配列を使用してポリモーフィズムを正しく処理します。 Post
の配列を持つクラスTags
がある場合は、_Tag = ABC
_の場所をフィルタリングできます。
C#linqメソッドを使用している場合、それは.Find(p => p.Tags == "ABC")
のようになります。 BsonDocument
を使用している場合、それはnew BsonDocument().Add("Tags", "ABC")
のようになります。
私は好きではない別の方法がありますが、それは機能します。正解とマークされた答えは半分間違っています(一致はビルダーの方法です)。この例では、/は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();
Filter.AnyInを使用してこれを機能させることができました
var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });
これは、複数の値を探している場合にも機能します。それらをリストに追加するだけです。