C# JObject实例需要documentdb批量插入

C# JObject实例需要documentdb批量插入,c#,azure,azure-cosmosdb,C#,Azure,Azure Cosmosdb,我有一个包含3年日历数据的列表,我在excel中有这些数据,所以我使用oledb读取数据并将其存储在列表中。您可以在下面找到列表 IList<BulkDateInsert> objExcelCon = ReadExcel(Filepath); 我正在使用documentdb,所以我希望上面的列表作为一个单独的文档,而不是每天单独的文档 尝试使用CreateDocumentSync()时出现此错误。 对象序列化为字符串。应为JObject实例 IList<BulkDateIn

我有一个包含3年日历数据的列表,我在excel中有这些数据,所以我使用oledb读取数据并将其存储在列表中。您可以在下面找到列表

IList<BulkDateInsert> objExcelCon = ReadExcel(Filepath);
我正在使用documentdb,所以我希望上面的列表作为一个单独的文档,而不是每天单独的文档

尝试使用CreateDocumentSync()时出现此错误。

对象序列化为字符串。应为JObject实例

 IList<BulkDateInsert> objExcelCon = ReadExcel(Filepath);
    JavaScriptSerializer js = new JavaScriptSerializer();
                        var json = js.Serialize(objExcelCon);
                        var ParsedJson = json.Replace("[", string.Empty).Replace("]", string.Empty);

                        await client.CreateDocumentAsync(collection.SelfLink, ParsedJson);
IList objExcelCon=ReadExcel(文件路径);
JavaScriptSerializer js=新的JavaScriptSerializer();
var json=js.Serialize(objExcelCon);
var ParsedJson=json.Replace(“[”,string.Empty)。Replace(“]”,string.Empty);
等待client.CreateDocumentAsync(collection.SelfLink,ParsedJson);
需要将它们作为单个文档插入,以便以后更容易查询

尝试使用createdocumentasync()时出现此错误 对象序列化为字符串。应为JObject实例

 IList<BulkDateInsert> objExcelCon = ReadExcel(Filepath);
    JavaScriptSerializer js = new JavaScriptSerializer();
                        var json = js.Serialize(objExcelCon);
                        var ParsedJson = json.Replace("[", string.Empty).Replace("]", string.Empty);

                        await client.CreateDocumentAsync(collection.SelfLink, ParsedJson);
请不要序列化列表对象并将其作为文档传递给创建用于存储3年日历数据的文档。如David Makogon所说,如果可能,请为每个日历条目创建文档。此外,您还可以将日历条目分组为批次,并为分组的日历条目创建单独的文档。以下简单示例供您参考

class Program
{
    string EndpointUri = "{endpoint URL}";
    string PrimaryKey = "{primary key}";
    DocumentClient client;

    static void Main(string[] args)
    {
        BulkDateInsert item = new BulkDateInsert() { CalendarDate = @"\/Date(1490985000000)\/", Calendarday = "Sat", isweekday = false, isweekend = true };
        BulkDateInsert item1 = new BulkDateInsert() { CalendarDate = @"\/Date(1491071400000)\/", Calendarday = "Sun", isweekday = false, isweekend = true };
        List<BulkDateInsert> list = new List<BulkDateInsert>();
        list.Add(item);
        list.Add(item1);

        IList<BulkDateInsert> objExcelCon= list;

        GroupedData gdata = new GroupedData() { Calendardata = objExcelCon };

       Program p = new Program();

        p.CreateDocumentForCalendarData(gdata).Wait();
    }

    private async Task CreateDocumentForCalendarData(GroupedData ParsedJson)
    {
        this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);

        await client.CreateDocumentAsync("dbs/{dbname}/colls/{collectionname}", ParsedJson);
    }

public class GroupedData {

    //could be weekly, monthly data
        public IList<BulkDateInsert> Calendardata { get; set; }
    }

    public class BulkDateInsert
    {
        public string CalendarDate { get; set; }
        public string Calendarday { get; set; }
        public bool isweekday { get; set; }
        public bool isweekend { get; set; }
    }
}
类程序
{
字符串EndpointUri=“{endpoint URL}”;
字符串PrimaryKey=“{primary key}”;
记录客户;
静态void Main(字符串[]参数)
{
BulkDateInsert item=new BulkDateInsert(){CalendarDate=@“\/Date(149098500000)\/”,Calendarday=“Sat”,isweekday=false,isweekend=true};
BulkDateInsert item1=new BulkDateInsert(){CalendarDate=@“\/Date(149107140000)\/”,Calendarday=“Sun”,isweekday=false,isweekend=true};
列表=新列表();
列表。添加(项目);
增加(第1项);
IList objExcelCon=列表;
GroupedData gdata=newgroupeddata(){Calendardata=objExcelCon};
程序p=新程序();
p、 CreateDocumentForCalendarData(gdata).Wait();
}
专用异步任务CreateDocumentForCalendarData(GroupedData ParsedJson)
{
this.client=newdocumentclient(新Uri(EndpointUri),PrimaryKey);
wait client.CreateDocumentAsync(“dbs/{dbname}/colls/{collectionname}”,ParsedJson);
}
公共类GroupedData{
//可以是每周、每月的数据
公共IList Calendardata{get;set;}
}
公共类数据插入
{
公共字符串CalendarDate{get;set;}
公共字符串Calendarday{get;set;}
公共bool isweekday{get;set;}
公共布尔值为{get;set;}
}
}

不知道你在用json.Replace()做什么,也不知道你的错误是什么,但是。。。试图将所有(数千?)日历条目加载到单个文档中是一个错误:由于最大文档大小限制,最终将失败。这是一个众所周知的“无界数组”场景。而且不容易查询;恰恰相反。即使文档中有这样一种重复类型的数据,它也需要在一个数组中(这意味着在数组中搜索查询)。我建议花更多的时间阅读文档存储和数据建模。我不可能梦想为您创建一个数据模型(因为这是一个相当开放的讨论),但是。。。您应该从每个日历条目都是自己的文档(与初始前提相反)这一基本概念开始,然后从那里开始。谢谢david,是的,大小限制是16kb。所以最好是每天单独插入,然后使用c#将它们全部放在一个列表中。那么,与循环相比,上面的方法有什么区别呢?性能有什么改进吗?所以我使用foreach和docdb emulator进行了1461条记录的excel插入,仅插入一条记录就需要20秒@400RU,所以我想知道我是否需要以百万为单位进行大容量插入,那么执行该操作将需要更多的分钟?因此,如果我有1000ru/s,那么每1kb就需要200次写入,5ru调整文档大小,使其大约为每分钟12k。请让我知道我的计算是否正确这就是定价的工作方式吗?如果在会话中配置了数据一致性,并且索引策略设置为无,1kb大小的文档+200次写入/秒将消耗约200*5=1000 RU/s。此外,在估计要保留用于收集的请求单元的数量时,有必要考虑到。并有助于估计作战需求单位的需求。