Как выполнить UPSERT с помощью Azure DocumentDB?

Azure DocumentDB не поддерживает UPSERT. Есть ли разумная работа для достижения той же функциональности?

Является ли использование хранимой процедуры, которая проверяет, существует ли документ, чтобы определить, следует ли выполнять вставку или обновление, эффективной стратегией?

Что, если мне нужно выполнить тысячи таких операций оптом?


Голосуйте за функцию здесь:

http://feedback.azure.com/forums/263030-documentdb/suggestions/7075256-provide-for-upsert


Обновление. Вот моя попытка создать хранимую процедуру массового обновления.

function bulkImport(docs) { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 
    var count = 0; 

    if (!docs) throw new Error('Docs parameter is null'); 

    var docsLength = docs.length; 
    if (docsLength == 0) { 
        getContext().getResponse().setBody(0); 
    } 

    tryUpsert(docs[count], callback); 

    function tryUpsert(doc, callback) {

        var query = { query: ""select * from root r where r.id = @id"", parameters: [ {name: ""@id"", value: doc.id}]};

        var isAccepted = collection.queryDocuments(collectionLink, query, function(err, resources, options) {
            if (err) throw err;                           

            if(resources.length > 0) {
                // Perform a replace       
                var isAccepted = collection.replaceDocument(resources[0]._self, doc, callback);     
                if (!isAccepted) getContext().getResponse().setBody(count);                          
            }
            else {
                // Perform a create
                var isAccepted = collection.createDocument(collectionLink, doc, callback);   
                if (!isAccepted) getContext().getResponse().setBody(count);                             
            }
        });  

        if (!isAccepted) getContext().getResponse().setBody(count); 
    }

    function callback(err, doc, options) { 
        if (err) throw err; 

        // One more document has been inserted, increment the count. 
        count++; 

        if (count >= docsLength) { 
            // If we have created all documents, we are done. Just set the response. 
            getContext().getResponse().setBody(count); 
        } else { 
            // Create next document. 
            tryUpsert(docs[count], callback); 
        } 
    } 
} 

person Vyrotek    schedule 02.06.2015    source источник


Ответы (1)


Обновление (06.10.2015): Atomic upsert теперь поддерживается Azure DocumentDB.


Да, процедура сохранения отлично подойдет для upsert.

На Github DocumentDB доступны даже образцы кода:

person Andrew Liu    schedule 02.06.2015
comment
Большое спасибо. Я был на пути к объединению этих концепций в сценарий массового импорта. Есть ли значительный прирост производительности от отправки набора документов в процесс, который выполняет каждую вставку, по сравнению с вызовом процесса по одному из моего кода? Возможно, это уменьшает RU? - person Vyrotek; 02.06.2015
comment
Отправка набора документов (по сравнению с отправкой по одному) может привести к значительному повышению производительности за счет сокращения количества сетевых циклов между приложением и базой данных. Однако разница с точки зрения RU незначительна. - person Andrew Liu; 02.06.2015
comment
Ссылки мертвы. - person Jeffpowrs; 23.06.2016
comment
Репозиторий примеров сценариев перемещен по адресу: github.com/Azure/. azure-documentdb-js-server/tree/master/samples - person Andrew Liu; 29.06.2016
comment
куда пропал массовый апсерт @AndrewLiu. Этого нет даже в ссылке или репозитории github. - person Atul Chaudhary; 27.11.2017
comment
@AtulChaudhary Я исправил первые 2 ссылки - person Ruben Bartelink; 09.11.2018