OrientDB:将什么合并到什么?
OrientDB: merge what to what?
我对 OrientDB 的 API 文档有点困惑。
ODocument#merge() 方法说:
Merge current document with the document passed as parameter. If the field already exists then the conflicts are managed based on the value of the parameter 'iUpdateOnlyMode'.
Parameters:
iOther - Other ODocument instance to merge
iUpdateOnlyMode - if true, the other document properties will always be added or overwritten. If false, the missed properties in the "other" document will be removed by original document
iMergeSingleItemsOfMultiValueFields - If true, merges single items of multi field fields (collections, maps, arrays, etc)
由此,我不知道什么时候合并到什么。这是改进后的状态,used to be worse因为有两个方法描述的更不清楚
有没有人对合并到什么有一个正常的解释?也许 Ron Kittle 会知道?
我做了一些测试,似乎 API 的名称有点奇怪或记录有误。
我希望 doc1.merge(doc2)
将 doc2
合并到 doc1
。因为您通常在编辑 doc1 并且可以连续合并多个内容,如下所示:
doc1.merge(partialDocA);
doc1.merge(partialDocB);
doc1.merge(partialDocC);
从merge()
的文档来看,OrientDB好像是这样写的:
partialDocA.merge(doc1, true, false);
partialDocB.merge(doc1, true, false);
partialDocC.merge(doc1, true, false);
其中 true
使 merge
不删除 doc1
的其余部分。使用 false
,它最终将只是 partialDocC
。那么,那是什么样的合并?那叫替换,不是合并。
但经过我运行一些测试,似乎第一种情况是正确的。
如果是真的,应该命名为mergeFrom(targetDoc, replaceInsteadOfMerge, somethingWithMultiFields)
.
因此,除非我忽略了什么,从 Map
保存文档看起来像这样:
public ODocument mergeDocument(Map<String, Object> incomingDocMap)
{
String sourceUri = (String) incomingDocMap.get(DocumentAttributes.SOURCE_URI.toString());
if (null == sourceUri)
throw new IllegalArgumentException("Document sourceUri is null.");
String docType = (String) incomingDocMap.get(Crawler.Attributes.TYPE);
if (null == docType)
throw new IllegalArgumentException("Document docType is null.");
// Get a document by sourceUri
String sql = "SELECT * FROM " + docType + " WHERE sourceuri=?";
activateOnCurrentThread();
List<ODocument> results = db.command(new OSQLSynchQuery<ODocument>(sql)).execute(sourceUri);
if (results.size() == 0)
throw new RuntimeException("No document with sourceUri '"+sourceUri+"'.");
// Update it from the given map.
ODocument incomingDoc = new ODocument(docType);
incomingDoc.fromMap(incomingDocMap);
//ODocument merged = incomingDoc.merge(results.get(0), true, false);
ODocument merged = results.get(0).merge(incomingDoc, true, false);
//merged.save(); /// Duplicated key
return merged;
}
这个方法连@return
都没有填,不知道能不能继续用原来的ODocument
。
做得好,OrientDB。
我对 OrientDB 的 API 文档有点困惑。 ODocument#merge() 方法说:
Merge current document with the document passed as parameter. If the field already exists then the conflicts are managed based on the value of the parameter 'iUpdateOnlyMode'.
Parameters:
iOther - Other ODocument instance to merge
iUpdateOnlyMode - if true, the other document properties will always be added or overwritten. If false, the missed properties in the "other" document will be removed by original document iMergeSingleItemsOfMultiValueFields - If true, merges single items of multi field fields (collections, maps, arrays, etc)
由此,我不知道什么时候合并到什么。这是改进后的状态,used to be worse因为有两个方法描述的更不清楚
有没有人对合并到什么有一个正常的解释?也许 Ron Kittle 会知道?
我做了一些测试,似乎 API 的名称有点奇怪或记录有误。
我希望 doc1.merge(doc2)
将 doc2
合并到 doc1
。因为您通常在编辑 doc1 并且可以连续合并多个内容,如下所示:
doc1.merge(partialDocA);
doc1.merge(partialDocB);
doc1.merge(partialDocC);
从merge()
的文档来看,OrientDB好像是这样写的:
partialDocA.merge(doc1, true, false);
partialDocB.merge(doc1, true, false);
partialDocC.merge(doc1, true, false);
其中 true
使 merge
不删除 doc1
的其余部分。使用 false
,它最终将只是 partialDocC
。那么,那是什么样的合并?那叫替换,不是合并。
但经过我运行一些测试,似乎第一种情况是正确的。
如果是真的,应该命名为mergeFrom(targetDoc, replaceInsteadOfMerge, somethingWithMultiFields)
.
因此,除非我忽略了什么,从 Map
保存文档看起来像这样:
public ODocument mergeDocument(Map<String, Object> incomingDocMap)
{
String sourceUri = (String) incomingDocMap.get(DocumentAttributes.SOURCE_URI.toString());
if (null == sourceUri)
throw new IllegalArgumentException("Document sourceUri is null.");
String docType = (String) incomingDocMap.get(Crawler.Attributes.TYPE);
if (null == docType)
throw new IllegalArgumentException("Document docType is null.");
// Get a document by sourceUri
String sql = "SELECT * FROM " + docType + " WHERE sourceuri=?";
activateOnCurrentThread();
List<ODocument> results = db.command(new OSQLSynchQuery<ODocument>(sql)).execute(sourceUri);
if (results.size() == 0)
throw new RuntimeException("No document with sourceUri '"+sourceUri+"'.");
// Update it from the given map.
ODocument incomingDoc = new ODocument(docType);
incomingDoc.fromMap(incomingDocMap);
//ODocument merged = incomingDoc.merge(results.get(0), true, false);
ODocument merged = results.get(0).merge(incomingDoc, true, false);
//merged.save(); /// Duplicated key
return merged;
}
这个方法连@return
都没有填,不知道能不能继续用原来的ODocument
。
做得好,OrientDB。