Azure DocumentDB - 查询不返回任何结果

时间:2014-11-18 08:00:35

标签: azure azure-cosmosdb

Azure DocumentDB是否支持以下查询?它不返回任何文件。

Variables values at runtime:
  1. collectionLink = "<link for my collection>"
  2. feedOptions = new FeedOptions { MaxItemCount = 2 }
  3. name = "chris"

client.CreateDocumentQuery<T>(collectionLink, feedOptions).Where(m => (m.Status == "Foo" && (m.Black.Name == null || m.Black.Name != name) && (m.White.Name == null || m.White.Name != name)));

我已经使用更简单的查询进行了测试,例如下面的查询,它们都会返回我期望的结果。

client.CreateDocumentQuery<T>(collectionLink, feedOptions).Where(m => m.Status == "Foo");

client.CreateDocumentQuery<T>(collectionLink, feedOptions).Where(m => m.Status == "Foo").Where(m => m.Size == 19);

最后,我确保有些文档符合有问题的查询过滤条件:

{
  "id": "1992db52-c9c6-4496-aaaa-f8cb83a8c6b0",
  "status": "Foo",
  "size": 19,
  "black": {
    "name": "charlie"
  },
  "white": {},
}

感谢。

2 个答案:

答案 0 :(得分:1)

结果&#34; m.White.Name == null || m.White.Name!= name&#34;检查有问题,因为数据库中的文档上不存在名称字段。

将文档编辑为以下内容时,查询将返回该文档。注意Name字段的显式空值。

{
  "id": "1992db52-c9c6-4496-aaaa-f8cb83a8c6b0",
  "status": "Foo",
  "size": 19,
  "black": {
    "name": "charlie"
  },
  "white": {
    "name": null
  },
}

答案 1 :(得分:1)

可以编写查询以使用DocumentDB UDF处理缺少的属性,如下所示。 DocumentDB使用JavaScript的语义,而显式的null与JavaScript中的缺失属性(“undefined”)不同。检查显式null很简单(= = null,就像查询一样),但要查询DocumentDB中可能存在或不存在的字段,必须先为ISDEFINED创建一个UDF:

function ISDEFINED(doc, prop) {
    return doc[prop] !== undefined;   
}

然后在DocumentDB查询中使用它,如:

client.CreateDocumentQuery<T>(
    collectionLink, 
   "SELECT * FROM docs m WHERE m.Status == "Foo" AND (ISDEFINED(m.white, "name") OR m.white.name != name)");

希望这会有所帮助。请注意,由于!=和UDF都需要扫描,因此只有在具有其他过滤器的查询中才能始终使用它们,这是性能/规模的一个好主意。