Couchbase 查询问题
Couchbase Query Issue
我们在从 .NET 客户端查询数据时遇到问题。这是我们的代码 运行:
var 查询 = $"SELECT d FROM default AS d where type='{type}'";
var result = Bucket.Query(查询);
问题是虽然 result.Rows 返回了正确的行数,但它们不包含任何数据。在执行 Buck.Query 后,我们可以看到实际返回的是 'd' 类型的实体列表,而不是 ContentBlocks 列表。似乎因此 JSON.NET 无法将其反序列化回正确的类型。
对此有什么想法吗?
更新: 实际上有一个更简单的解决方案。您所要做的就是按如下方式更改镍查询:
SELECT default.* FROM default WHERE type='{type}'
这会将 return 文档直接作为 JSON 个对象的数组,而不是将它们添加为 sub-properties。这样SDK就可以正确反序列化结果了。
原回答:
.NET SDK 中 QueryClient 默认反序列化的当前实现似乎存在错误。我已经给维护它的人发了电子邮件,看看这是他们已经在努力解决的问题,还是一个新问题。
同时,您可以通过使用 N1QL 查询获取文档 ID,然后作为 key-value 操作批量检索文档本身来解决此问题:
var query = "select meta(default).id as docId from default where type='{type}'";
var res = _bucket.Query<dynamic>(query);
var docs = _bucket.Get<ContentBlock>(res.Rows.Select(r => r["docId"].Value as string).ToList())
.Select(r => r.Value);
可能还有一种方法可以使用自定义序列化程序来解决它,但这将需要更多工作,并且将来当您想恢复正常使用 Query 时也更难删除。
我们在从 .NET 客户端查询数据时遇到问题。这是我们的代码 运行:
var 查询 = $"SELECT d FROM default AS d where type='{type}'"; var result = Bucket.Query(查询);
问题是虽然 result.Rows 返回了正确的行数,但它们不包含任何数据。在执行 Buck.Query 后,我们可以看到实际返回的是 'd' 类型的实体列表,而不是 ContentBlocks 列表。似乎因此 JSON.NET 无法将其反序列化回正确的类型。
对此有什么想法吗?
更新: 实际上有一个更简单的解决方案。您所要做的就是按如下方式更改镍查询:
SELECT default.* FROM default WHERE type='{type}'
这会将 return 文档直接作为 JSON 个对象的数组,而不是将它们添加为 sub-properties。这样SDK就可以正确反序列化结果了。
原回答:
.NET SDK 中 QueryClient 默认反序列化的当前实现似乎存在错误。我已经给维护它的人发了电子邮件,看看这是他们已经在努力解决的问题,还是一个新问题。
同时,您可以通过使用 N1QL 查询获取文档 ID,然后作为 key-value 操作批量检索文档本身来解决此问题:
var query = "select meta(default).id as docId from default where type='{type}'";
var res = _bucket.Query<dynamic>(query);
var docs = _bucket.Get<ContentBlock>(res.Rows.Select(r => r["docId"].Value as string).ToList())
.Select(r => r.Value);
可能还有一种方法可以使用自定义序列化程序来解决它,但这将需要更多工作,并且将来当您想恢复正常使用 Query 时也更难删除。