繁体   English   中英

MongoDb:使用和C#实现具有可变结构的文档

[英]MongoDb: documents with variable structure using and C#

我有一个HTML表单,用于创建具有动态结构的文档。 下面是用户插入的一些数据样本。

一个非常简单的文件

{
"name" : "Simple element",
"notes" : "Lorem ipsum rocks",
"values" : [ 
    {
        "name" : "An array with 2 values",
        "value" : [ 100,200],
        "editable" : true
    }
]

}

和更复杂的文件

{
"name" : "Complex element",
"notes" : "Lorem ipsum rocks",
"values" : [ 
    {
        "name" : "A text value",
        "value" : "ABCDEF",
        "editable" : true
    }, 
    {
        "name" : "A numeric value",
        "value" : 100,
        "editable" : false
    }, 
    {
        "name" : "A array of 4 values",
        "value" : [1,2,3,4],
        "editable" : false
    }, 
    {
        "name" : "A matrix 2x4",
        "value" : [[1,2,3,4],[5,6,7,8]],
        "editable" : false
    }
]

}

必须使用C#MongoCharp驱动程序和NancyFX将文档保存在MongoDB中。 目前以这种方式实现POST,但我不确定这是否是处理具有动态结构的对象的正确方法

Post["/api/docs"] = _ =>
{
  //looking for better solution
  var json = Request.Body.AsString();
  var item = BsonDocument.Parse(json);
  database.GetCollection("docs").Insert(item);
  return new Response { StatusCode = HttpStatusCode.Created };
};

但是找不到适合GET方法的好的解决方案

Get["/api/docs"] = _ =>
{
  //looking for solution
};

您认为什么是此方案的最佳解决方案?

还有另一种解决问题的方法。 我们称之为“强类型解决方案”。 我创建了两个POCO对象

public class DocumentItem
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public String Id { get; set; }

    public String Name { get; set; }

    public String Notes { get; set; }

    public SubItem[] Values { get; set; }

}

public class SubItem
{
    public String Name { get; set; }

    public Boolean Editable { get; set; }

    public Object Value { get; set; }
}

比在模块中读取数据的实现如下所示

    Get["/api/docs/{id}"] = p => database.GetCollection<DocumentItem>("docs")
            .FindOne(Query<DocumentItem>.EQ(x => x.Id, (string)p.id));

    Get["/api/docs"] = _ => database.GetCollection<DocumentItem>("docs")
            .FindAll()
            .ToList();

我可以通过这种方式对插入使用绑定

   Post["/api/docs"] = _ =>
   {
      var item = this.Bind<DocumentItem>();
      database.GetCollection("docs").Insert(item);
      return item;
   };

如果您只是想将MongoDB中的文档作为json返回,请尝试以下操作

Get["/api/docs/{category}"] = _ =>
{
   var filterValue = _.category;
   //Search the DB for one record where the category property matches the filterValue
   var item = database.GetCollection("docs").FindOne(Query.EQ("category", filterValue))
   var json = item.ToJson();

   var jsonBytes = Encoding.UTF8.GetBytes(json );
   return new Response
   {
      ContentType = "application/json",
      Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length)
   };
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM