C#在BsonDocument中执行查询以查找等效文档

时间:2015-10-05 20:31:22

标签: c# mongodb linq bson

我有一个复杂的嵌套动态BsonDocument,我需要查询该文档以查找所有"记录"具有相同的"类型"。

Json的一个例子是:

{
"Id": "",
"CategoryId": "41",
"FormVersion": "4",
"Metadata":{
    "title": "some title",
    "author": "Kevin B.",
    "location": {
        "url": "ed5cf2ea-c920-43b2-807b-65f5e4cac650.jpeg",
      "type": "upload",
        "size": "1001",
        "format": "application/json",
        "numbers": [1,2,3,4]
    },
    "file": {
        "url": "ed5cf2ea-c920-43b2-807b-65f5e4cacddf50.jpeg",
      "type": "upload",
        "size": "1001",
        "format": "application/json",
        "numbers": [1,2,3,4]
    }
}
}

这与我的控制器中的自定义ModelBinder映射到此类:

内容

public class Content : Base
{
    public Guid Id { get; set; }
    public int FormVersion { get; set; }
    public int CategoryId { get; set; }
    public BsonDocument Metadata { get; set; }
}

正如您在上面所看到的,"元数据" get被映射到BsonDocument。

现在,在将整个文档保存到MongoDB之前,我需要找到所有"记录"具有类型"上传"。我需要这个,因为我需要移动临时文件夹中的文件,这些记录包含临时文件URI。

在示例中,位置文件是具有" upload"类型的对象。我需要以某种方式查询这个bsondocument并只获取这些文件,移动文件并保存。

我尝试过使用linq,但没有成功。我已查看this,但我没有收藏品可供使用。它只是一个对象。

1 个答案:

答案 0 :(得分:0)

使用LINQ时,基本上构建Expression<Func<T, bool>>T是您的文档类型。然后LINQ解析此表达式并使用属性访问器来构建特定于数据库的查询。

您正在尝试将动态对象属性内容用作过滤器。这不起作用,因为LINQ不知道如何在动态对象的内容中命名属性。

查询此类模式的唯一方法是使用本机MongoDb查询,因为您可以使用普通字符串撰写查询。