使用过滤器将mongo查询转换为C#

时间:2020-07-27 17:39:09

标签: c# .net mongodb mongodb-query mongodb-.net-driver

有什么方法可以在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

1 个答案:

答案 0 :(得分:1)

这里的困难在于EmailData.Attachments.Files是另一个数组中的一个数组,因此当您尝试使用表达式树时,C#编译器将丢失。

非常感谢您需要使用MongoDB .NET驱动程序定义字段时的另一种方法。您可以利用StringFieldDefinition<T>类。

尝试:

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();