在 MongoDB .NET 中使用 Regex 针对带有 `ElemMatch` 的简单列表
Using a Regex against a simple list with `ElemMatch` in MongoDB .NET
给定一个包含字符串列表的文档,您如何 assemble C# MongoDB 查询每个列表项的正则表达式?
例如,这里有一些数据。
{
"_id": {
"$oid": "4ded270ab29e220de8935c7b"
},
// ... some other stuff ...
"categories": [
{
"Some Category",
"Another Category",
"Yet Another Category",
"One Last Category"
}
]
},
最终,我将如何构造一个可以通过 MonoDB LINQ 提供程序进行强类型化的查询?
{ "categories": { $elemMatch: { $regex: someSearch, $options: "i" } } }
我正在尝试使用 ElemMatch
来实现这一点,但我似乎无法构造一个 BsonRegularExpression 来使用该方法。如果数据是键控元素列表,看起来我可以为某些键工作,比如 itemName
.
// Doesn't translate to a list of raw strings.
Query.ElemMatch ("categories", Query.Match("itemName", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
不过,当我尝试让正则表达式直接在 ElemMatch
上工作时,我无法匹配重载。
// Doesn't compile: cannot convert BsonRegularExpress to IMongoQuery.
Query.ElemMatch ("categories", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
有什么方法可以直接将 BsonRegularExpression
转换为 IMongoQuery
对象吗?
或者是否有一些 Matches
语法用于在允许两者混合的列表中应用当前迭代元素?类似这样的代码。
// Doesn't work: totally making this up.
Query.ElemMatch ("categories", Query.Matches (iteratorElement, new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
我希望避免只将原始字符串发送到 MongoDB 驱动程序,这样我就可以从注入中逃脱搜索字符串,这样代码就不会乱七八糟地充满魔法字符串字段名称(而是有限的只是数据库模型字段上的 BsonElement
属性)。
这可能不是您所追求的 100%(因为它不是 IQueryable);但它确实实现了您想要的(使用 Linq 对集合进行强类型正则表达式过滤):
var videosMongo = DbManager.Db.GetCollection<Video> ("videos");
var videosCollection = videosMongo.AsQueryable<Video> ();
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two", "test three", "four test", "five" },
Name = "video one"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two", "test three", "four test", "five" },
Name = "video two"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two" },
Name = "video three"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "a test" },
Name = "video four"
});
var videos = videosCollection.Where (v => v.Name == "video four").ToList ();
var collection = DbManager.Db.GetCollection<Video> ("videos");
var regex = new BsonRegularExpression ("test");
var query = Query<Video>.Matches (p => p.Tags, regex);
var results = collection.Find (query).ToList ();
我使用这里的优秀资源解决了这个问题:http://www.layerworks.com/blog/2014/11/11/mongodb-shell-csharp-driver-comparison-cheat-cheet
给定一个包含字符串列表的文档,您如何 assemble C# MongoDB 查询每个列表项的正则表达式?
例如,这里有一些数据。
{
"_id": {
"$oid": "4ded270ab29e220de8935c7b"
},
// ... some other stuff ...
"categories": [
{
"Some Category",
"Another Category",
"Yet Another Category",
"One Last Category"
}
]
},
最终,我将如何构造一个可以通过 MonoDB LINQ 提供程序进行强类型化的查询?
{ "categories": { $elemMatch: { $regex: someSearch, $options: "i" } } }
我正在尝试使用 ElemMatch
来实现这一点,但我似乎无法构造一个 BsonRegularExpression 来使用该方法。如果数据是键控元素列表,看起来我可以为某些键工作,比如 itemName
.
// Doesn't translate to a list of raw strings.
Query.ElemMatch ("categories", Query.Match("itemName", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
不过,当我尝试让正则表达式直接在 ElemMatch
上工作时,我无法匹配重载。
// Doesn't compile: cannot convert BsonRegularExpress to IMongoQuery.
Query.ElemMatch ("categories", new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
有什么方法可以直接将 BsonRegularExpression
转换为 IMongoQuery
对象吗?
或者是否有一些 Matches
语法用于在允许两者混合的列表中应用当前迭代元素?类似这样的代码。
// Doesn't work: totally making this up.
Query.ElemMatch ("categories", Query.Matches (iteratorElement, new BsonRegularExpression (new Regex (someSearch, RegexOptions.IgnoreCase)));
我希望避免只将原始字符串发送到 MongoDB 驱动程序,这样我就可以从注入中逃脱搜索字符串,这样代码就不会乱七八糟地充满魔法字符串字段名称(而是有限的只是数据库模型字段上的 BsonElement
属性)。
这可能不是您所追求的 100%(因为它不是 IQueryable);但它确实实现了您想要的(使用 Linq 对集合进行强类型正则表达式过滤):
var videosMongo = DbManager.Db.GetCollection<Video> ("videos");
var videosCollection = videosMongo.AsQueryable<Video> ();
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two", "test three", "four test", "five" },
Name = "video one"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two", "test three", "four test", "five" },
Name = "video two"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "one", "two" },
Name = "video three"
});
videosMongo.Insert (new Video () {
Id = new ObjectId (),
Tags = new string[]{ "a test" },
Name = "video four"
});
var videos = videosCollection.Where (v => v.Name == "video four").ToList ();
var collection = DbManager.Db.GetCollection<Video> ("videos");
var regex = new BsonRegularExpression ("test");
var query = Query<Video>.Matches (p => p.Tags, regex);
var results = collection.Find (query).ToList ();
我使用这里的优秀资源解决了这个问题:http://www.layerworks.com/blog/2014/11/11/mongodb-shell-csharp-driver-comparison-cheat-cheet