How can I perform an UPSERT using Azure DocumentDB?

被刻印的时光 ゝ 提交于 2019-12-10 18:46:03

问题


Azure DocumentDB does not support UPSERT. Is there a reasonable work around to achieve the same functionality?

Is using a stored procedure which checks if the document exists to determine whether and insert or update should be performed an effective strategy?

What if I need to perform thousands of these in bulk?


Vote for the feature here:

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


Update - Here is my attempt at a bulk upsert stored procedure.

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

回答1:


Update (2015-10-06): Atomic upsert is now supported by Azure DocumentDB.


Yes, a store procedure would work great for upsert.

There are even code samples available on DocumentDB's Github:

  • Upsert (Optimized for Insert): https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsert.js

  • Upsert (Optimized for Replace): https://github.com/aliuy/azure-node-samples/blob/master/documentdb-server-side-js/stored-procedures/upsertOptimizedForReplace.js

  • Bulk Import / Upsert: https://github.com/Azure/azure-documentdb-hadoop/blob/master/src/BulkImportScript.js



来源:https://stackoverflow.com/questions/30586399/how-can-i-perform-an-upsert-using-azure-documentdb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!