如何将对象列表作为参数传递给Azure CosmosDB(DocumentDB)存储过程?

时间:2018-10-24 07:26:42

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi azure-cosmosdb-tables

我正在尝试在我的一个收藏夹(例如页面)中执行批量更新。我已经为此创建了一个存储过程,当我从Azure执行时,它运行良好。但是问题出在我通过REST API执行时。

当我将对象列表传递给存储过程函数时,某些方法仅取第一个对象。

这是我的批量更新SP

function bulkImport(docs) {
if(typeof docs==="string")
    docs= JSON.parse(docs);
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var count=0;
// Validate input.
if (!docs) throw new Error("The array is undefined or null.");
var docsLength = docs.length;
if (docsLength == 0) {
    getContext().getResponse().setBody(0);
}
tryUpdate(docs[count], callback);
function tryUpdate(doc, callback) {
    var requestOptions = { etag: doc._etag };
   var isAccepted = collection
                     .replaceDocument(doc._self,
                                      doc,
                                      requestOptions,
                                      callback);        
    if (!isAccepted) getContext().getResponse().setBody(count);
}
function callback(err, doc, options) {
    if (err) throw err;
    count++;

    if (count >= docsLength) {
        getContext().getResponse().setBody(count);
    } else {
        tryUpdate(docs[count], callback);
    }
}

我使用RestSharp作为http客户端发出REST请求。

public static IRestResponse ExecuteStoredProcedure(string sprocs, string dbName, string colls, string key, string baseurl, string api_Version, string parameter)
    {
        //REST API URL Replace Document By Id PUT https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/docs/{doc-name}
        var client = new RestClient(baseurl + "dbs/" + dbName + "/colls/" + colls + "/sprocs/" + sprocs);
        //using getRquest() to Adding Header to the request
        var request = GetRequest(api_Version, Method.POST, dbName, colls, key,
            "dbs/" + dbName + "/colls/" + colls + "/sprocs/" + sprocs, "sprocs");
        request.AddParameter("undefined", parameter, ParameterType.RequestBody);
        return Execute(client, request);
    }

这是我的示例数据,作为参数传递给上述函数

[{
    "id": "somestring",
    "query": {},
    "createdDate": "",
    "updatedDate": "",
    "createdBy": "Sai",
    "updatedBy": "Sai",
    "_rid": "somevalue",
    "_self": "somevalue,
    "_etag": "somevalue",
    "_attachments": "attachments/",
    "_ts": 0
},
{
    "id": "someid",
    "query": {},
    "createdDate": "",
    "updatedDate": "",
    "createdBy": "Sai",
    "updatedBy": "Sai",
    "_rid": "somevalue",
    "_self": "somevalue,
    "_etag": "somevalue",
    "_attachments": "attachments/",
    "_ts": 0
}

]

在SP中,如果我这样做

docs[0]._etag

我收到未定义的错误

异常详细信息

{
"code": "BadRequest",
"message": "Message: {\"Errors\":[\"Encountered exception while executing Javascript. Exception = TypeError: Unable to get property '_etag' of undefined or null reference\\r\\nStack trace: TypeError: Unable to get property '_etag' of undefined or null reference\\n   at tryUpdate (bulkUpdatePage.js:21:9)\\n   at bulkImport (bulkUpdatePage.js:13:5)\\n   at __docDbMain (bulkUpdatePage.js:55:5)\\n   at Global code (bulkUpdatePage.js:1:2)\"]}\r\nActivityId: 358544ea-07ee-45fd-9612-65295aa36900, Request URI: /apps/97eda9fb-4d31-43ec-816e-e341bfd2b031/services/962b1d52-8e1c-4d3a-a20e-1dc6ddca59f5/partitions/a75f0fb5-bd14-46a4-b0bb-a35e3cb3a2be/replicas/131823537009439236p, RequestStats: \r\nRequestStartTime: 2018-10-24T07:53:42.4855657Z, Number of regions attempted: 1\r\n, SDK: Microsoft.Azure.Documents.Common/2.0.0.0"

}

请帮助,我被阻止了。 我有什么想念的吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我得到了解决方案,并将其留在这里,以便将来我可以帮助某人

  

在REST级别上,sproc请求主体是sproc函数参数的数组,此数组中的每个项目都是sproc的单独参数。如果您需要将文档数组作为第一个参数,请再添加一个[],即使用类似以下的内容:[[{{id“:1},{” id“:2}]]。 REST的一般提示:使用Fiddler并查看使用REST并执行相同形式的API(使用连接协议= https)或DocumentDBStudio时通过网络传递的内容。

谢谢

快乐编码