【问题标题】:Make Azure DocumentDB do not return service fields使 Azure DocumentDB 不返回服务字段
【发布时间】:2016-04-02 17:01:07
【问题描述】:

我在节点应用程序中为 Azure DocumentDB 使用类似 SQL 的语法。这是方法代码

client.queryDocuments(collection._self, "SELECT * FROM root").toArray(function(err, results) {
    if (err) {
        callback(err);
    } else {
        callback(null, results);
    }
});

和回应

[
{
    "id": "test1",
    "name": "Kate",
    "email": "test@mail.com",
    "brands": [
        "AAAA",
        "BBB",
        "CCCi"
    ],
    "_rid": "WedNAN3lZgABAAAAAAAAAA==",
    "_self": "dbs/WedNAA==/colls/WedNAN3lZgA=/docs/WedNAN3lZgABAAAAAAAAAA==/",
    "_etag": "\"00001b00-0000-0000-0000-56fff6c60000\"",
    "_ts": 1459615430,
    "_attachments": "attachments/"
}

]

有没有办法让 DocumentDb 不重新运行服务字段(_rid、_self、_etag、_ts、_attachments),但不在 select 子句中写入所有非服务字段?

【问题讨论】:

    标签: node.js azure azure-cosmosdb nosql


    【解决方案1】:

    更新

    仅使用查询,没有办法使用查询来取回除系统字段之外的所有字段,但没有在 SELECT 子句中列出每个非系统字段。但是,您可以使用在返回之前过滤它们的存储过程来执行此操作,或者使用 UDF 执行相同的操作(见下文)。

    更新

    其他人建议在列表返回后删除它们,但在考虑了更多之后,可以通过查询和简单的用户定义函数 (UDF) 来做到这一点:

    function stripUnderscoreFields (o) { 
      output = {};
    
      for (key in o) {
        value = o[key];
        if (key.indexOf('_') !== 0) {
          output[key] = value;
        }
      }
      return output 
    }
    

    然后在这样的查询中使用 UDF:

    SELECT VALUE udf.stripUnderscoreFields(c) FROM collection c
    

    【讨论】:

    • 你确定他/她不能在 node.js 中使用 DocumentDB Query Projections 解决这个问题,我只熟悉 .NET,你可以。
    • 如果可以指定字段,那就可以了。我不熟悉查询投影(除非你的意思是自我加入)。该功能是否在 .NET SDK 中而不是在 DocumentDB 本身中找到?不过总的来说,我鼓励 node.js 用户利用 DocumentDB 独特的数据库端编程能力。 Node.js/JavaScript 开发人员可以毫不费力地将代码从应用服务器甚至浏览器移动到数据库中。他们可以在 node.js 内测试 sproc 的数据库内执行。他们可以将 npm 包(一些)推送到他们的存储过程中。对他们来说,这是一个非常自然的环境。
    • 请参阅 azure.microsoft.com/en-us/documentation/articles/… 了解 DocumentDB 查询预测。
    • 你能发布你在 .NET 中是如何做到的吗?这可能会提供一些线索。您发布的链接只是将“投影”称为 SELECT 子句的一项功能,我看不出如何在不指定每个字段的情况下获取每个字段,但系统字段除外。
    • 像这样使用CreateDocumentQuery() DocClient.CreateDocumentQuery(resourceSelfLink, "SELECT name, email FROM root", feedOptions)
    【解决方案2】:

    根据Azure DocumentDB REST APIQuery Documents,这些字段由系统生成,请参阅API文档的Response - Body部分了解文档的属性。

    Node.js 的 DocumentDB SDK 封装了相关的 REST API,因此如果您不想返回,可以尝试在回调函数中过滤它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多