2017-09-06 155 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進行驗證。