将VALUE关键字与Document DB中的其他SELECT元素组合在一起

时间:2016-08-09 15:42:23

标签: sql azure azure-cosmosdb

我试图使用VALUE关键字与其他特定字段相结合来展平JSON文档而没有运气。

给出文档DB文档:

{
    "id": "Tenant-Test",
    "name": "Test",
    "timeZone": "Eastern Standard Time",
    "section1": {
        "section1Key1": "section 1 value 1",
        "section1Key2": "section 1 value 2",
        ...
    },
    "section2": {
        "section2Key1": "section 2 value 1"
    }
}

我希望得到以下形状的数据子集:

{
    "id": "Tenant-Test",
    "name": "Test",
    "timeZone": "Eastern Standard Time",
    "section1Key1": "section 1 value 1",
    "section1Key2": "section 1 value 2"
}

理论上我可以用

查询
SELECT c.id, c.name, c.timeZone, VALUE c.section1 FROM c

这会在' VALUE'附近出现语法错误。如果我删除特定字段c.id,c.name,c.timeZone,那么我可以展平c.section1。

是否可以执行此转换?

2 个答案:

答案 0 :(得分:3)

Aravind的另一种解决方案如下:

void Main()
{
    var a0 = new A();
    a0.Subscribe();
    a0.Subscribe();
    a0.Subscribe();
    a0.Dispose();
    a0 = null;

    GC.Collect(); //Has no effect. Demonstrates Garbage collection doesn't help.
}

class A : IDisposable
{
    IObservable<long> poll = Observable.Interval(TimeSpan.FromMilliseconds(100)).Do(l => l.Dump());
    IDisposable disposable;
    public void Subscribe()
    {
        Dispose();
        //memory leak!!
        poll.Subscribe();

        //Use this instead
            //disposable = poll.Subscribe();
    }

    public void Dispose()
    {
        disposable?.Dispose();
    }
}

答案 1 :(得分:1)

您可以使用UDF执行此操作:

function transform(o) { 
  output = {}
  output.id = o.id
  output.name = o.name
  output.timeZone = o.timeZone
  output.section1Key1 = o.section1.section1Key1
  output.section1Key2 = o.section1.section1Key2
  return output 
}

您可以使用无论多宽或多深都会变平的循环来替换硬编码的剖面投影。

然后在如下查询中使用UDF:

SELECT VALUE udf.transform(c) FROM collection c

注意,上面示例中的关键字VALUE会抑制在每个文档之前添加的$ 1前缀。