Azure DocumentDB - 如何从特定日期的集合中获取文档?

时间:2017-03-09 13:53:35

标签: java database azure-cosmosdb nosql

每个文档在存储时都包含日期属性,因此如何获取在特定日期或两个日期之间存储的数据。做这个的最好方式是什么。我的实现基于Java。提前谢谢。

2 个答案:

答案 0 :(得分:0)

我没有Java代码,但是你必须设置你的集合以在DateTime字符串上使用Range索引,然后你就可以查询某个日期内的日期了。时间范围。 .NET代码用于设置范围索引是:

DocumentCollection collection = new DocumentCollection { Id = "orders" };
collection.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) { Precision = -1 });
await client.CreateDocumentCollectionAsync("/dbs/orderdb", collection);

请参阅https://docs.microsoft.com/en-us/azure/documentdb/documentdb-working-with-dates#indexing-datetimes-for-range-queries并在此页面上搜索范围https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing-policies

答案 1 :(得分:0)

使用Azure DocumentDB SDK for Java按_ts属性查询文档。文档_ts属性如下所示。

  

_ts :这是系统生成的属性。它指定资源的上次更新时间戳。该值是时间戳。

以下是我的示例代码。 _ts单位是第二位。

// Initialize a DocumentDb client.
String serviceEndpoint = "https://<your-documentdb-name>.documents.azure.com:443/";
String masterKey = "<your-documentdb-key>";
DocumentClient client = new DocumentClient(serviceEndpoint, masterKey, ConnectionPolicy.GetDefault(), ConsistencyLevel.Session);
// Get a collection link via collection id.
String collId = "<collection-Id>";
String query = String.format("SELECT * from ROOT r WHERE r.id = '%s'", dcId);
FeedOptions options = null;
List<DocumentCollection> dcs = client.queryCollections(dbLink, query, options).getQueryIterable().toList();
String collLink = dcs.size() >0 ? dcs.get(0).getSelfLink() : null;
// Generate a query string, see below.
.......
client.queryDocuments(collection.getSelfLink(), query, null);

用于获取存储在特定日期的数据的查询字符串:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = "2017-03-01";
long timestamp = sdf.parse(dateStr).getTime()/1000;
String query = String.format("select * from c where c._ts = %d", timestamp);

用于获取存储在两个日期之间的数据的查询字符串:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String startDateStr = "2017-03-01";
String endDateStr = "2017-03-31";
long tsStart = sdf.parse(startDateStr).getTime()/1000;
long tsEnd = sdf.parse(endDateStr).getTime()/1000;
String query = String.format("select * from c where c._ts >= %d and c._ts <= %d", tsStart, tsEnd);