【问题标题】:Couchbase partial update not working as expectedCouchbase 部分更新未按预期工作
【发布时间】:2018-02-14 14:35:24
【问题描述】:

我正在对 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: SUBDOC_INVALID_COMBO 在 com.couchbase.client.java.subdoc.SubdocHelper.commonSubdocErrors(SubdocHelper.java:100) 在 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 个属性,我也会遇到同样的异常。

【问题讨论】:

    标签: javascript couchbase partial upsert java-client


    【解决方案1】:

    来自Couchbase Sub-Document API documentation(参见限制部分):

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

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

    使用 Couchbase Java SDK 2.3.7 版验证。

    【讨论】:

      【解决方案2】:

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

      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();            
      }
      

      这是一种低效的技巧。欢迎提供更好的解决方案。

      【讨论】:

        【解决方案3】:

        您可以一次组合 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-28
          • 2019-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-03
          相关资源
          最近更新 更多