Couchbase N1QL 结果根据 SELECT 语法改变形状
Couchbase N1QL result changes shape depending on SELECT syntax
我是 Couchbase 的新手,我 运行 遇到了一个真正困扰我的行为。假设我在 C# 中定义了这个 class:
public class Thing
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
我将它存储在 Couchbase 中一个名为 ThingBucket 的存储桶中。现在,如果我进入 Couchbase 查询 Workbench 并输入:
SELECT Property1, Property2 FROM ThingBucket
我得到的是一个 JSON 对象,它将直接反序列化为一个 Thing 数组:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
这很好,因为我无需执行任何特殊操作即可将其反序列化为事物。 Couchbase C# 驱动程序调用 Json.NET 进行反序列化,它正常工作。
但是,如果我输入:
SELECT * FROM ThingBucket
我没有得到一组 Thing。我得到了完全不同的东西:
[
{
"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 文档中示例的样子,所以看起来这种行为是意料之中的。
有没有一种优雅的方法可以使它成为 return 原始形状而不用列出 SELECT 语句中的每个 属性?另外,这种行为是否有一些我的新手没有看到的价值?
RAW 关键字可能就是您要查找的内容。
SELECT c FROM customer c
得到这个:
[
{
"c": {
"Property1": "Value",
"Property2": "Value"
}
}
]
SELECT RAW c FROM customer c
得到这个:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
由于这种行为,我通常更喜欢使用这样的别名编写 N1QL:
SELECT b.* FROM myBucket b;
随着您的查询变得越来越复杂(使用 JOIN 和 UNNEST 等),您最终还是会需要这些别名。
我是 Couchbase 的新手,我 运行 遇到了一个真正困扰我的行为。假设我在 C# 中定义了这个 class:
public class Thing
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
我将它存储在 Couchbase 中一个名为 ThingBucket 的存储桶中。现在,如果我进入 Couchbase 查询 Workbench 并输入:
SELECT Property1, Property2 FROM ThingBucket
我得到的是一个 JSON 对象,它将直接反序列化为一个 Thing 数组:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
这很好,因为我无需执行任何特殊操作即可将其反序列化为事物。 Couchbase C# 驱动程序调用 Json.NET 进行反序列化,它正常工作。
但是,如果我输入:
SELECT * FROM ThingBucket
我没有得到一组 Thing。我得到了完全不同的东西:
[
{
"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 文档中示例的样子,所以看起来这种行为是意料之中的。
有没有一种优雅的方法可以使它成为 return 原始形状而不用列出 SELECT 语句中的每个 属性?另外,这种行为是否有一些我的新手没有看到的价值?
RAW 关键字可能就是您要查找的内容。
SELECT c FROM customer c
得到这个:
[
{
"c": {
"Property1": "Value",
"Property2": "Value"
}
}
]
SELECT RAW c FROM customer c
得到这个:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
由于这种行为,我通常更喜欢使用这样的别名编写 N1QL:
SELECT b.* FROM myBucket b;
随着您的查询变得越来越复杂(使用 JOIN 和 UNNEST 等),您最终还是会需要这些别名。