我正在使用最新版本的Mongo C#驅動程序,它使用了大量的異步和生成器模式。這很好。我試圖將SQL where子句轉換爲Mongo FilterDefinition對象。Mongo C#驅動程序 - 包含過濾器
任何想法如何處理「包含」?
像:
where x contains 'ABC'
我正在使用最新版本的Mongo C#驅動程序,它使用了大量的異步和生成器模式。這很好。我試圖將SQL where子句轉換爲Mongo FilterDefinition對象。Mongo C#驅動程序 - 包含過濾器
任何想法如何處理「包含」?
像:
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())
{
// ...
}
謝謝! 我使用的是2.0版本的驅動程序,無法在過濾器生成器上使用.Matches(),但我可以找到.Regex(),所以我會嘗試使用它。 – Mr767267
首先,我強烈建議採取MongoDB University's .NET course(從蒙戈本身)。這是非常徹底的,並且深入地涵蓋了您的問題(以及更多)。
其次,我假設x
是你的例子中的一個數組。
MongoDB正確處理數組的多態性。如果你有一個類Post
和Tags
的數組,你可以過濾哪裏Tag = ABC
。
如果您使用C#linq方法,那看起來像.Find(p => p.Tags == "ABC")
。如果您使用的是BsonDocument
,那看起來像new BsonDocument().Add("Tags", "ABC")
。
我有另一種方式,我不喜歡,但它的作品。標記正確的答案是錯誤的一半(匹配是建造者的一種方法)。在這個例子中,/行爲像一個sql查詢LIKE語句中的%。我仍然在尋找更好的方法,如果我發現下面更多的Equals過濾器,我會更新它。
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();
您的篩選器的構建器方法不正確。它不能等於因爲你正在尋找Contains。 –
爲了實現在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
是'x'一個字符串? – CodeCaster