使用 Filter 将 mongo 查询转换为 C#
translating mongo query to C# by using Filter
有没有什么方法可以在 C# 中使用过滤器并翻译此 mongo 查询?
{'EmailData.Attachments.Files': {$all: [{Name: 'a.txt'},{Name: 'b.txt'},{Name:'c.txt'}], $size: 3}}
我的数据模型是这样的:
{
"_id": ObjectId("5f0a9c07b001406068c073c1"),
"EmailData" : [
{
"Attachments" : {
"Files" : [
{
"Name" : "a.txt"
},
{
"Name" : "b.txt"
},
{
"Name" : "c.txt"
}
]
}
}
]
}
我心里有这样的想法:
var Filter =
Builders<EmailEntity>.Filter.All(s => s.EmailData????);
或类似的东西:
var Filter =
Builders<EmailEntity>.Filter.ElemMatch(s => s.EmailData???)
我想知道在上面的过滤器中是否有任何方法可以在 ElemMatch 中使用 All
?
这里的困难在于 EmailData.Attachments.Files
是另一个数组中的一个数组,因此当您尝试使用表达式树时,C# 编译器会迷失方向。
值得庆幸的是,当您需要使用 MongoDB .NET 驱动程序定义字段时,还有另一种方法。您可以利用 StringFieldDefinition<T>
class.
尝试:
var files = new[] { new FileData(){ Name = "a.txt"}, new FileData() { Name = "b.txt" }, new FileData() { Name = "c.txt" } };
FieldDefinition<EmailEntity> fieldDef = new StringFieldDefinition<EmailEntity>("EmailData.Attachments.Files");
var filter = Builders<EmailEntity>.Filter.And(
Builders<EmailEntity>.Filter.All(fieldDef, files),
Builders<EmailEntity>.Filter.Size(fieldDef, 3));
var result= collection.Find(filter).ToList();
有没有什么方法可以在 C# 中使用过滤器并翻译此 mongo 查询?
{'EmailData.Attachments.Files': {$all: [{Name: 'a.txt'},{Name: 'b.txt'},{Name:'c.txt'}], $size: 3}}
我的数据模型是这样的:
{
"_id": ObjectId("5f0a9c07b001406068c073c1"),
"EmailData" : [
{
"Attachments" : {
"Files" : [
{
"Name" : "a.txt"
},
{
"Name" : "b.txt"
},
{
"Name" : "c.txt"
}
]
}
}
]
}
我心里有这样的想法:
var Filter =
Builders<EmailEntity>.Filter.All(s => s.EmailData????);
或类似的东西:
var Filter =
Builders<EmailEntity>.Filter.ElemMatch(s => s.EmailData???)
我想知道在上面的过滤器中是否有任何方法可以在 ElemMatch 中使用 All
?
这里的困难在于 EmailData.Attachments.Files
是另一个数组中的一个数组,因此当您尝试使用表达式树时,C# 编译器会迷失方向。
值得庆幸的是,当您需要使用 MongoDB .NET 驱动程序定义字段时,还有另一种方法。您可以利用 StringFieldDefinition<T>
class.
尝试:
var files = new[] { new FileData(){ Name = "a.txt"}, new FileData() { Name = "b.txt" }, new FileData() { Name = "c.txt" } };
FieldDefinition<EmailEntity> fieldDef = new StringFieldDefinition<EmailEntity>("EmailData.Attachments.Files");
var filter = Builders<EmailEntity>.Filter.And(
Builders<EmailEntity>.Filter.All(fieldDef, files),
Builders<EmailEntity>.Filter.Size(fieldDef, 3));
var result= collection.Find(filter).ToList();