Couchbase N1QL结果根据SELECT语法改变形状

时间:2019-01-23 06:10:28

标签: c# couchbase n1ql

我是Couchbase的新手,并且遇到了确实困扰我的行为。假设我已经在C#中定义了此类:

public class Thing
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

我将其存储在名为ThingBucket的存储桶中的Couchbase中。现在,如果我进入Couchbase查询工作台并输入:

SELECT Property1, Property2 FROM ThingBucket

我得到的是一个JSON对象,它将直接反序列化为Thing数组:

[
    {
        "Property1": "Value",
        "Property2": "Value"
    }
]

这很好,因为我不必做任何特殊的事情就可以将其反序列化为事物。 Couchbase C#驱动程序调用Json.NET进行反序列化,并且可以正常工作。

但是,如果我输入:

SELECT * FROM ThingBucket

我没有得到Thing的数组。我完全得到了其他东西:

[
    {
      "ThingBucket": {
          "Property1": "Value",
          "Property2": "Value"
      }
    }
]

现在,我有了一个数组,而不是Thing数组,而这些数组在我的C#代码中根本不存在。它是一个对象数组,其中每个对象都有一个Thing属性。为了使它反序列化为Thing,我必须使用[JsonProperty]属性覆盖Thing,这似乎是多余的并且很丑陋:

public class Thing
{
    [JsonProperty("Property1")]
    public string Property1 { get; set; }
    [JsonProperty("Property2")]
    public string Property2 { get; set; }
}

这是CouchbaseNetClient文档中的示例,因此似乎是这种情况。

是否有一种优雅的方法可以使它返回原始形状,而不用列出SELECT语句中的每个属性?另外,这种行为是否有价值,我的新手眼睛看不到?

2 个答案:

答案 0 :(得分:4)

您可能正在寻找RAW关键字。

SELECT c FROM customer c可为您提供:

[
  {
    "c": {
      "Property1": "Value",
      "Property2": "Value"
    }
  }
]

SELECT RAW c FROM customer c为您带来了这一点:

[
  {
    "Property1": "Value",
    "Property2": "Value"
  }
]

答案 1 :(得分:2)

由于这种行为,我通常更喜欢用这样的别名编写N1QL:

SELECT b.* FROM myBucket b;

随着查询变得越来越复杂(使用JOIN和UNNEST等),您最终还是要使用这些别名。