Couchbase Server KV Error: "EINVAL" on null Upsert

Couchbase Server KV Error: "EINVAL" on null Upsert

我有一个 Couchbase 文档,我想使用服务器版本 6.6.0、CouchbaseNetClient 3.0.5、Couchbase.Extensions.DependencyInjection 3.0.4.811 进行变异。

文件:

{
    "name": "First Last",
    "email": null
}

变异代码:

var bucket = await _bucketProvider.GetBucketAsync();
await bucket.DefaultCollection().MutateInAsync(updatedProfile.Id, new[]
{
    MutateInSpec.Upsert("name", updatedProfile.Name),
    MutateInSpec.Upsert("email", updatedProfile.Email)
});

当新的电子邮件值为空时,出现以下错误:

KV Error: {Name="EINVAL", Description="Invalid packet", Attributes="internal,invalid-input"}

这似乎是一个错误,不幸的是我无法在 GitHub 上向 .NET 客户端的存储库提交问题。

我在这里找到了一个类似的 post Couchbase 无法在多个具有空值的更新插入中进行 Mutate ,但即使我只更新一个值,它仍然不会变为 null。

任何帮助将不胜感激。

注意:以下是重现问题的示例片段。

class Program
{
    private static ICluster _cluster;

    static async Task Main(string[] args)
    {
        var userInfo = new
        {
            Name = "User1",
            Email = (string)null // *** This is causing the exception. ***
        };

        _cluster = await Cluster.ConnectAsync("couchbase://localhost", "Administrator", "Password");

        var bucket = await _cluster.BucketAsync("items");
        await bucket.DefaultCollection().MutateInAsync("doc1", new[]
        {
            MutateInSpec.Upsert("name", userInfo.Name),
            MutateInSpec.Upsert("email", userInfo.Email) // *** Setting the null value ***
        });

        _cluster.Dispose();
    }
}

编辑: Couchbase Jira 问题 - https://issues.couchbase.com/browse/NCBC-2640

更新:这似乎是一个错误 - https://issues.couchbase.com/browse/NCBC-2640


我刚刚使用最新版本的 .NET SDK (3.0.5, just released today) 进行了尝试,它可以正常工作,没有错误。我首先手动创建了您的示例文档。然后我 运行 在控制台应用程序中这样做:

class Program
{
    private static ICluster _cluster;

    static async Task Main(string[] args)
    {
         _cluster = await Cluster.ConnectAsync("couchbase://localhost", "Administrator", "password");

        var bucket = await _cluster.BucketAsync("bucket");
        var result = await bucket.DefaultCollection().MutateInAsync("doc1", new[]
        {
            MutateInSpec.Upsert("name", "new name"),
            MutateInSpec.Upsert("email", "new email") // this works fine, but `default(string)` instead of "new email" causes an exception
        });

        _cluster.Dispose();
    }
}

在不知道您使用的是哪个版本的 SDK 的情况下,我推测这是一个已修复的错误。

另一种可能性:我注意到 _bucketProvider 的使用。 Couchbase.Extensions.DependencyInjection 库可能默认使用旧版本的 SDK,因此请记住,您可以 add/update 两个库分别使用 NuGet。 (同样,只是推测您可能使用的是什么版本)。

这已被 Couchbase 团队确定为一个错误。您可以在此处关注进度 - https://issues.couchbase.com/browse/NCBC-2640