2017-09-06 67 views
1

我做一个couchbase文件的部分更新内容如下: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_INVALID_COMBO .subdocHelper.commonSubdocErrors(SubdocHelper.java:100) at com.couchbase.client.java.subdoc.AsyncMutateInBuilder $ 2.call(AsyncMutateInBuilder.java:1094) at com.couchbase.client.java.subdoc.AsyncMutateInBuilder $ 2 .call(AsyncMutateInBuilder.java:1052)

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

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

编辑#1:

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

回答

0

现在,我们已经按类分组属性,并执行尽可能多的文档upserts,因为有类型。

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

这是一个低效率的黑客攻击。欢迎提供更好的解决方案。

1

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

你可能不查找式或突变,在命令中结合使用超过16个操作。

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

使用Couchbase Java SDK版本2.3.7进行验证。