我在查询 Mongo-DB 集合时遇到了困难。
我正在使用的文档
public class Customer
{
public ObjectId Id { get; set; }
public int CustomerId { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public string Name { get; set; }
}
一些样本数据
{
CustomerId: 2,
Addresses: [
{
Name: "Daniel"
},
{
Name: "Eric"
},
{
Name: "Dan"
}
]
}
我现在想通过 CustomerId 查询文档并过滤一些地址值以返回名称为 %Dan% 的所有地址。由于地址集合可能很大,我想在查询时过滤这些地址
var mdb = mongoClient.GetDatabase("test");
var collection = mdb.GetCollection<WebApi>("Customer");
var builder = Builders<Customer>.Filter;
var searchTerm = "Dan";
当这样查询时,它可以工作,但它包含所有地址:
var filter = builder.And(builder.Eq("InstallationId", 2),
builder.Regex("Addresses.Name", new BsonRegularExpression(".*" + searchTerm + ".*", "i")))
var result = collection.Find(filter).FirstOrDefault();
我想得到的是:
[
{
Name: "Daniel"
},
{
Name: "Dan"
}
]
或者
{
CustomerId: 2,
Addresses: [
{
Name: "Daniel"
},
{
Name: "Dan"
}
]
}
我还尝试了几种使用 Aggregate/Match/Project 的方法,但无法使其正常工作。“AsQueryable”也不起作用,因为驱动程序上没有实现 IndexOf。
collection.AsQueryable().Where(x => x.CustomId == 2).SelectMany(x =>
x.Addresses.Where(a => a.Name.IndexOf(searchTerm, StringComparison.InvariantCultureIgnoreCase) >= 0).ToList();
使用版本:
- MongoDB.Driver v 2.6.1(也是 Bson)
- .Net 框架 4.5.2