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": {},
}
感谢。
答案 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都需要扫描,因此只有在具有其他过滤器的查询中才能始终使用它们,这是性能/规模的一个好主意。