10

我正在使用最新版本的 Mongo C# 驱动程序,它使用了很多异步和构建器模式。这很好。我正在尝试将 SQL where 子句转换为 Mongo FilterDefinition 对象。

知道如何处理“包含”吗?
喜欢:

where x contains 'ABC'
4

6 回答 6

17

为了在 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 
于 2016-04-06T08:47:20.070 回答
7

如果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())
{
    // ...
}
于 2015-08-21T11:08:49.137 回答
1

我能够像这样使用 Filter.AnyIn 来完成这项工作

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

如果您也在寻找多个值,这也适用,只需将它们添加到列表中即可。

于 2019-11-22T19:35:47.330 回答
1

首先,我强烈推荐参加MongoDB 大学的 .NET 课程(来自 Mongo 本身)。它非常彻底,并且深入涵盖了您的问题(以及更多问题)。

其次,我假设这x是您示例中的一个数组。

MongoDB 正确处理数组的多态性。如果您有一个Post包含 数组的类Tags,则可以过滤 where Tag = ABC

如果您使用的是 C# linq 方法,则看起来像.Find(p => p.Tags == "ABC"). 如果您正在使用BsonDocument,那看起来像new BsonDocument().Add("Tags", "ABC")

于 2015-08-21T11:06:35.323 回答
0

我有另一种我不喜欢但它有效的方法。标记为正确的答案有一半是错误的(Matches 是 Builders 的一种方法)。在此示例中, / 就像 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();
于 2015-11-15T20:17:06.257 回答
0

如果您只想搜索输入text,则需要替换正则表达式特殊字符。

Regex.Escape将确保这些字符是按字面处理而不是作为元字符处理的。否则,输入text可用于查询可能不是必需的正则表达式模式。

var text = "ABC";
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(Regex.Escape(text)));

如果您需要不区分大小写的检查。然后您可以将不区分大小写的正则表达式传递给BsonRegularExpression.Create

var text = "ABC";
var escapeText = Regex.Escape(text);
var regex = new Regex(escapeText, RegexOptions.IgnoreCase);
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(regex));
于 2021-08-16T20:55:57.983 回答