我在玩https://www.documentdb.com/sql/demo,这使我可以查询类似于以下内容的示例文档:
{ "id": "19015", "description": "Snacks, granola bars, hard, plain", "tags": [ { "name": "snacks" } ], "version": 1, "isFromSurvey": false, "foodGroup": "Snacks", "servings": [ { "amount": 1, "description": "bar", "weightInGrams": 21 } ] }
我很困惑ARRAY_CONTAINS()。该查询返回结果:
ARRAY_CONTAINS()
SELECT root FROM root WHERE ARRAY_CONTAINS(root.tags, { "name": "snacks" })
但是,此查询不会:
SELECT root FROM root WHERE ARRAY_CONTAINS(root.servings, { "description": "bar" })
是什么赋予了?
如果这是C#,我将如何编写查询来说明我要实现的目标:
var filteredDocs = docs.Where(d => d.Servings != null && d.Servings.Length > 0 && d.Servings.Any(s => s.Description == "bar"));
它出现在第一示例查询root.tags因为作品{ "name": "snacks" }是 整个 中对象root.tags阵列,而在第二个查询,{ "description": "bar" }仅 一个字段 中的root.servings对象。
root.tags
{ "name": "snacks" }
{ "description": "bar" }
root.servings
如何修改第二个查询,root.servings使其仅在知道服务的情况下起作用description?
description
编辑:ARRAY_CONTAINS现在支持部分匹配,如吉姆·斯科特(Jim Scott)在下面指出的那样,我认为这是一个比这个公认的更好的答案。
您的servings数组只有一个条目{"amount": 1, "description": "bar", "weightInGrams": 21}。
servings
{"amount": 1, "description": "bar", "weightInGrams": 21}
这可以在您的示例中一次食用:
SELECT root FROM root WHERE root.servings[0].description = "bar"
但这听起来并不是您要的。因此,假设您具有以下条件:
{ ... "servings": [ {"description": "baz", ....}, {"description": "bar", ....}, {"description": "bejeweled", ....} ], ... }
并且您想查找其中一份的描述为“ bar”的文档,那么您可以使用以下UDF:
function(servings, description) { var s, _i, _len; for (_i = 0, _len = servings.length; _i < _len; _i++) { s = servings[_i]; if (s.description === description) { return true; } } return false; }
使用此查询:
SELECT * FROM c WHERE udf.findServingsByDescription(c.servings, "bar")