我正在尝试在我的一个收藏夹(例如页面)中执行批量更新。我已经为此创建了一个存储过程,当我从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"
}
请帮助,我被阻止了。 我有什么想念的吗?
谢谢!
答案 0 :(得分:0)
我得到了解决方案,并将其留在这里,以便将来我可以帮助某人
在REST级别上,sproc请求主体是sproc函数参数的数组,此数组中的每个项目都是sproc的单独参数。如果您需要将文档数组作为第一个参数,请再添加一个[],即使用类似以下的内容:[[{{id“:1},{” id“:2}]]。 REST的一般提示:使用Fiddler并查看使用REST并执行相同形式的API(使用连接协议= https)或DocumentDBStudio时通过网络传递的内容。
谢谢
快乐编码