2

我正在对 couchbase 文档进行部分更新,如下所示:

...
MutateInBuilder builder = bucket.mutateIn(id);
for (Map.Entry<String, Object> entry : map.entrySet())
{
    builder = builder.upsert(entry.getKey(), entry.getValue());
}
builder.execute();
...

当所有 upsert 调用中的所有值都属于同一类型时,一切正常。

但是,如果某些值是字符串,并且说其他值是布尔值,我们就会遇到异常:

com.couchbase.client.core.CouchbaseException:com.couchbase.client.java.subdoc.SubdocHelper.commonSubdocErrors(SubdocHelper.java:100) 处的 SUBDOC_INVALID_COMBO com.couchbase.client.java.subdoc.AsyncMutateInBuilder$2.call(AsyncMutateInBuilder. java:1094) 在 com.couchbase.client.java.subdoc.AsyncMutateInBuilder$2.call(AsyncMutateInBuilder.java:1052)

在 upsert 的测试用例中,找不到任何更新多个属性的情况。

我们如何在 Couchbase 中插入具有不同类型属性的文档?

编辑#1:

现在,事情变得更奇怪了......如果我在一次迭代中更新超过 16 个属性,我会遇到同样的异常。

4

3 回答 3

1

Couchbase 子文档 API 文档(请参阅限制部分):

您不能在一个查找输入或突变输入命令中组合超过 16 个操作。

我猜你在两种情况下都遇到了这个限制,混合值类型和单值类型。

使用 Couchbase Java SDK 版本 2.3.7 验证。

于 2017-09-07T01:27:36.637 回答
0

您可以一次组合 16 个操作中的多个操作并执行 mutateInBuilder。这将减少操作次数。

        MutateInBuilder mutateInBuilder = bucket.mutateIn(id);
        int valueCount = 1;

        for (Map.Entry<String, JsonElement> entry : valueEntries) {
            mutateInBuilder.upsert(entry.getKey(), entry.getValue().getAsString());
            if(valueCount % 16 == 0){ // Limitation of subdoc operations for jdk 2.7
                mutateInBuilder.execute();
                mutateInBuilder = bucket.mutateIn(id);
            }
            valueCount++;
        }

        mutateInBuilder.execute();
于 2019-11-23T15:56:15.600 回答
0

目前,我们已按类对属性进行分组,并执行与类型一样多的文档更新插入。

for(Map.Entry<Class, Map<String, Object>> entry : attributesByClass.entrySet())
{
    MutateInBuilder builder = bucket.mutateIn(id);
    for (Map.Entry<String, Object> tmp : entry.getValue().entrySet())
    {
        builder = builder.upsert(tmp.getKey(), tmp.getValue());
    }
    builder.execute();            
}

这是一个低效的黑客。欢迎提出更好的解决方案。

于 2017-09-06T11:04:20.197 回答