使用 equal、contains、startswith 和 endswith 过滤查询时出现意外结果
Unexpected results while filtering query with equal, contains, startswith and endswith
SELECT value count(1) from c where c.FormName = "Newsletter"
returns 2191
SELECT value count(1) from c where contains (c.FormName, "Newsletter")
returns 697
SELECT value count(1) from c where startswith(c.FormName, "Newsletter")
returns 2191
SELECT value count(1) from c where endswith(c.FormName, "Newsletter")
returns 701
我原以为所有这些请求 return 的值都是相同的 2191,但 contains
和 endswith
return 是一个意外的值。
这正常吗?
是正常的。所有这些查询都会消耗一些 RU。每个查询将使用的 RU 不同,因为它们 "load" 不同。
当您执行 SELECT value count(1)
时,您会强制 Cosmos return 所有结果都在一个查询中。但是,Cosmos DB 按照设计只有 returns 分页结果。这种分页还有助于将负载分散到许多查询中并将它们聚合到客户端站点上。 SELECT value count(1)
不允许进行此类聚合,因此您得到的响应是您请求前 运行 的 RU 数。
如果您 SELECT c.id from c where blablabla
并且使用 while(query.HasMoreResults)
和 query.ExecuteNextAsync()
方法并在客户端汇总计数,您应该得到相同的数字。
SELECT value count(1) from c where c.FormName = "Newsletter"
returns 2191
SELECT value count(1) from c where contains (c.FormName, "Newsletter")
returns 697
SELECT value count(1) from c where startswith(c.FormName, "Newsletter")
returns 2191
SELECT value count(1) from c where endswith(c.FormName, "Newsletter")
returns 701
我原以为所有这些请求 return 的值都是相同的 2191,但 contains
和 endswith
return 是一个意外的值。
这正常吗?
是正常的。所有这些查询都会消耗一些 RU。每个查询将使用的 RU 不同,因为它们 "load" 不同。
当您执行 SELECT value count(1)
时,您会强制 Cosmos return 所有结果都在一个查询中。但是,Cosmos DB 按照设计只有 returns 分页结果。这种分页还有助于将负载分散到许多查询中并将它们聚合到客户端站点上。 SELECT value count(1)
不允许进行此类聚合,因此您得到的响应是您请求前 运行 的 RU 数。
如果您 SELECT c.id from c where blablabla
并且使用 while(query.HasMoreResults)
和 query.ExecuteNextAsync()
方法并在客户端汇总计数,您应该得到相同的数字。