Sql 如何从CosmosDB中删除特定日期后的记录

Sql 如何从CosmosDB中删除特定日期后的记录,sql,stored-procedures,azure-cosmosdb,Sql,Stored Procedures,Azure Cosmosdb,我有一个集合activities它包含一个字段activityDate,其中包含类似2017-02-24T19:04:18Z 我想删除此集合中比numberOfDays更早的所有记录 我通过编写cosmosdb存储过程来执行此任务 我试着做些类似的事情 var query = 'SELECT * FROM activities a WHERE a.activityDate > = "' + numberOfDays+ '"'; 我在执行查询时遇到问题,因为它在语法上不正确 或者也可以有其

我有一个集合
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字符串转换为日期对象,然后向其中添加1000*60*60*24*numberOfDays,然后使用日期对象中的方法将其转换回ISO-8601字符串(
Date.toISOString()
在JavaScript中,但您的语言可能不同)。在WHERE子句中可能有一些使用JavaScript表达式的方法,但我不知道。即使有,我也不建议这样做,因为这样做会使查询成为一个完整的表扫描。因此,我建议您在客户端执行此转换和减法操作,以获取要放入查询子句中的标量字符串。

以下是解决我问题的方法:

// 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;
    }
}
谢谢

{
  "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": []
}