我是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语句中的每个属性?另外,这种行为是否有价值,我的新手眼睛看不到?
答案 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等),您最终还是要使用这些别名。