如何从特定日期前的 CosmosDB 中删除记录
How to delete the record from CosmosDB specific days back
我有一个集合 activities
它包含一个字段 activityDate
,其中包含 2017-02-24T19:04:18Z
这样的日期
我想从该集合中删除所有早于 numberOfDays
的记录。
我正在通过编写 cosmosdb 存储过程来执行此任务
我试试
var query = 'SELECT * FROM activities a WHERE a.activityDate > = "' + numberOfDays+ '"';
我在执行查询时遇到问题,因为它在语法上不正确
或者可以有其他的方法。
提前致谢。
您需要将 a.activityDate
与 today
减去 numberOfDays
进行比较。进行减法的最简单方法是将 ISO-8601 字符串转换为 Date 对象,然后向其添加 1000*60*60*24*numberOfDays,然后使用 Date 对象中的方法将其转换回 ISO-8601 字符串( Date.toISOString()
在 JavaScript 中,但您的语言可能不同)。可能有一些方法可以在 WHERE 子句中使用 JavaScript 表达式,但我不知道。即使有,我也不会推荐它,因为这样做会使查询成为完整的 table 扫描。因此,我建议您在客户端执行此转换和减法操作,以获得要放入查询子句中的标量字符串。
这是我的问题的解决方案:
// SAMPLE STORED PROCEDURE
function deleteActivitiesBackDate(numberOfDays) {
var context = getContext();
var collection = context.getCollection();
var link = collection.getSelfLink();
var response = context.getResponse();
//validate inputs
if(!numberOfDays || (typeof numberOfDays != "string")){
return errorResponse(400, (!numberOfDays) ? "numberOfDays is Undefined":"String type is expected for numberOfDays.");
}
var targetDate = new Date();
targetDate.setDate(targetDate.getDate() - numberOfDays);
console.log("targetDate is "+targetDate);
var query = 'SELECT * FROM activities a WHERE a.activityDate < "' + targetDate+ '"';
var run = collection.queryDocuments(link, query, {}, callback);
function callback(err, docs) {
if (err){
return errorResponse(400, err.message);
}
if (docs.length > 0){
deleteDoc(docs);
}else {
return errorResponse(400, "The document was not found.");
}
}
if (!run) {
return errorResponse(400, "The document could not be deleted.");
}
function deleteDoc(document) {
var docDeleted = collection.deleteDocument(document._self, function(err, result){
if (err){
return errorResponse(400, err.message);
}
response.setBody(result);
});
if (!docDeleted) {
return errorResponse(400, "The document could not be deleted.");
}
};
function errorResponse(code,message){
var errorObj = {};
errorObj.code = code;
errorObj.message = message;
errorObj.date = getDateTime();
return response.setBody(errorObj);
}
function getDateTime(){
var currentdate = new Date();
var dateTime = currentdate.getFullYear() + "-" +(currentdate.getMonth()+1)+ "-" + currentdate.getDate()+ " " +currentdate.getHours()+":"+currentdate.getMinutes()+":"+currentdate.getSeconds();
return dateTime;
}
}
你还需要启用分区才能执行(<,>,<=,>=,!=)
所以尝试:
里面还有custom
有以下JSON
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Spatial",
"dataType": "Point"
},
{
"kind": "Spatial",
"dataType": "Polygon"
}
]
}
],
"excludedPaths": []
}
谢谢
我有一个集合 activities
它包含一个字段 activityDate
,其中包含 2017-02-24T19:04:18Z
我想从该集合中删除所有早于 numberOfDays
的记录。
我正在通过编写 cosmosdb 存储过程来执行此任务
我试试
var query = 'SELECT * FROM activities a WHERE a.activityDate > = "' + numberOfDays+ '"';
我在执行查询时遇到问题,因为它在语法上不正确
或者可以有其他的方法。
提前致谢。
您需要将 a.activityDate
与 today
减去 numberOfDays
进行比较。进行减法的最简单方法是将 ISO-8601 字符串转换为 Date 对象,然后向其添加 1000*60*60*24*numberOfDays,然后使用 Date 对象中的方法将其转换回 ISO-8601 字符串( Date.toISOString()
在 JavaScript 中,但您的语言可能不同)。可能有一些方法可以在 WHERE 子句中使用 JavaScript 表达式,但我不知道。即使有,我也不会推荐它,因为这样做会使查询成为完整的 table 扫描。因此,我建议您在客户端执行此转换和减法操作,以获得要放入查询子句中的标量字符串。
这是我的问题的解决方案:
// SAMPLE STORED PROCEDURE
function deleteActivitiesBackDate(numberOfDays) {
var context = getContext();
var collection = context.getCollection();
var link = collection.getSelfLink();
var response = context.getResponse();
//validate inputs
if(!numberOfDays || (typeof numberOfDays != "string")){
return errorResponse(400, (!numberOfDays) ? "numberOfDays is Undefined":"String type is expected for numberOfDays.");
}
var targetDate = new Date();
targetDate.setDate(targetDate.getDate() - numberOfDays);
console.log("targetDate is "+targetDate);
var query = 'SELECT * FROM activities a WHERE a.activityDate < "' + targetDate+ '"';
var run = collection.queryDocuments(link, query, {}, callback);
function callback(err, docs) {
if (err){
return errorResponse(400, err.message);
}
if (docs.length > 0){
deleteDoc(docs);
}else {
return errorResponse(400, "The document was not found.");
}
}
if (!run) {
return errorResponse(400, "The document could not be deleted.");
}
function deleteDoc(document) {
var docDeleted = collection.deleteDocument(document._self, function(err, result){
if (err){
return errorResponse(400, err.message);
}
response.setBody(result);
});
if (!docDeleted) {
return errorResponse(400, "The document could not be deleted.");
}
};
function errorResponse(code,message){
var errorObj = {};
errorObj.code = code;
errorObj.message = message;
errorObj.date = getDateTime();
return response.setBody(errorObj);
}
function getDateTime(){
var currentdate = new Date();
var dateTime = currentdate.getFullYear() + "-" +(currentdate.getMonth()+1)+ "-" + currentdate.getDate()+ " " +currentdate.getHours()+":"+currentdate.getMinutes()+":"+currentdate.getSeconds();
return dateTime;
}
}
你还需要启用分区才能执行(<,>,<=,>=,!=)
所以尝试:
里面还有custom
有以下JSON
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Spatial",
"dataType": "Point"
},
{
"kind": "Spatial",
"dataType": "Polygon"
}
]
}
],
"excludedPaths": []
}
谢谢