一尘不染

具有ARRAY_CONTAINS的DocumentDB SQL

sql

我在玩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()。该查询返回结果:

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.servings使其仅在知道服务的情况下起作用description


阅读 155

收藏
2021-05-05

共1个答案

一尘不染

编辑:ARRAY_CONTAINS现在支持部分匹配,如吉姆·斯科特(Jim Scott)在下面指出的那样,我认为这是一个比这个公认的更好的答案。

您的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")
2021-05-05