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。