我是Couchbase的新手,我遇到过一种让我非常困扰的行为。假设我在C#中定义了这个类:
public class Thing
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
我将它存储在Couchbase中一个名为ThingBucket的存储桶中。现在,如果我进入Couchbase查询工作台并输入:
SELECT Property1, Property2 FROM ThingBucket
我得到的是一个JSON对象,它将直接反序列化为一个对象数组:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
这很好,因为我不需要做任何特殊的事情就可以把它反序列化为一个东西。Couchbase C#驱动程序调用Json.NET进行反序列化,并且它可以正常工作。
但是,如果我输入:
SELECT * FROM ThingBucket
我没有得到一个数组的东西。我得到了完全不同的东西:
[
{
"ThingBucket": {
"Property1": "Value",
"Property2": "Value"
}
}
]
现在,我有了一个C#代码中根本不存在的形状数组,而不是一组东西。它是一个对象数组,其中每个对象都有一个属性,这是一个事物。为了将其反序列化为Thing,我必须用JsonProperty属性来覆盖Thing,这看起来既多余又丑陋:
public class Thing
{
[JsonProperty("Property1")]
public string Property1 { get; set; }
[JsonProperty("Property2")]
public string Property2 { get; set; }
}
这就是CouchbaseNetClient文档中的示例,所以看起来这是意料之中的行为。
有没有一种优雅的方法可以让它返回原始形状,而不列出SELECT语句中的每个属性?另外,这种行为有没有我的新手眼睛看不到的价值呢?
发布于 2019-01-23 12:51:13
RAW关键字可能是您要查找的关键字。
SELECT c FROM customer c
为您提供了以下内容:
[
{
"c": {
"Property1": "Value",
"Property2": "Value"
}
}
]
SELECT RAW c FROM customer c
为您提供了以下内容:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
发布于 2019-01-23 14:45:53
由于这种行为,我通常更喜欢使用这样的别名编写N1QL:
SELECT b.* FROM myBucket b;
随着查询变得越来越复杂(使用JOIN和UNNEST等),您最终还是需要这些别名。
https://stackoverflow.com/questions/54320981
复制相似问题