首页 > 解决方案 > 为什么从 .net SDK 3.1 查询具有多个键(肯定存在)的复合键视图返回零结果?正确的格式是什么?

问题描述

我有以下 Map 函数的索引(并且没有 reduce 函数):

  if (doc.someId && doc.anotherId)
  {
                emit([doc.someId, doc.anotherId], doc);
  }

SomeId 是 int,anotherId 是字符串。

我正在使用 dotnet SDK 3.1 ( https://www.nuget.org/packages/CouchbaseNetClient/3.1.1 ) 来查询视图,如下所示:

var options = new ViewOptions();

object id = new object[] { 123, "777" };
options.Key(ids);

IViewResult<object, T> result;
result = await bucket.ViewQueryAsync<object, T>(designDocument, viewName, options);
var rows = await result.Rows.Select(r => r.Value).ToListAsync();

(designDocument 和 viewName 正确,已建立连接)

我成功地得到了正确的文件。

但是,当我想使用 'options.Keys()' 函数查询多个键时,我得到的结果为零(同样两个键都存在于 couchbase 中):

object[,] ids = new object[,] { { 123, "777" }, { 456, "888" } };
options.Key(ids);
IViewResult<object, T> result;
result = await bucket.ViewQueryAsync<object, T>(designDocument, viewName, options);
var rows = await result.Rows.Select(r => r.Value).ToListAsync();

即使我尝试仅使用一个复合键,但将数组数组用于“Keys()”函数而不是单个数组用于“Key()”函数。

object[,] ids = new object[,] { { 123, "777" } };
options.Keys(ids);

零。

object[,] ids = new object[,] { { 456, "888" } };
options.Keys(ids);

零。

object id = new object[] { 123, "777"  };
options.Key(id);

一个结果。

为什么会这样?这是正确的格式吗?它曾经是旧版本 dotnet SDK 上的格式。

我还尝试在 ViewQueryAsync 通用函数中使用不同的类型,但没有成功。

这个 SDK 的文档很差,我找不到任何所需格式的示例或解释。

标签: .netcouchbasecouchbase-view

解决方案


在使用 fiddler 调查旧 SDK 版本(1.0)和新版本后 - 以错误方式发送的格式(SDK 3.1)是

[[[123:"777"],[456:"888"]]]

正确的(SDK 1.0)是

[[123:"777"],[456:"888"]]

与邮递员一起,我尝试使用第一种格式并且它有效。

所以我尝试像这样传递给 Keys 函数数组:

options.Keys(new object[]{123, "777"}, new object[]{456, "888"});

它奏效了。格式是正确的。我得到了结果。

Keys 函数接受

params object[]? keys

推荐阅读