2016-11-09 274 views
2

假設我有一個集合Col1已經存在於我的數據庫中。所以,做這樣的事情:如何檢查一個集合是否已經存在於ArangoDB

var col = db.collection('Col1'); 
col.save({"name":"something"}); 

將工作得很好。

但是,如果一個集合Col2不已經在我的數據庫存在,則試圖用同樣的東西即

var col = db.collection('Col2'); 
col.save({"name":"something"}) 

將完全正常工作爲好。只有它不存在,並且不會顯示在我的數據庫中。如果它拋出一些錯誤或東西我可以使用trycatch陳述結果。但是既然這樣,我怎麼知道一個集合是否已經存在?

回答

0

https://docs.arangodb.com/3.1/Manual/DataModeling/Collections/DatabaseMethods.html#collection狀態

返回單個集合或空db._collection(集合名稱)

所以你可以使用

var col2 = db._collection('Col2'); 
if (col2) { 
    // collection exists 
    col2.save({"name":"something"}); 
} 
+0

儘管arangoDB的文檔說它可以工作,但節點的軟件包'arangojs'不同意它。對於不存在的集合,我的代碼保存在if子句中時顯示爲「true」。 我想要一個arangojs解決方案。目前,我只是在所有收藏列表中檢查收藏名稱以檢查收藏的存在。但是我的方法很粗糙,我自己也不喜歡 – Prasanna

2

col.save不執行保存操作立即返回一個承諾。所以它會一直成功。解決的辦法是等待的承諾得到解決,然後根據是否發生錯誤或沒有反應過來:

var col = db.collection('Col2'); 
col.save({"name":"something"}).then(
    meta => console.log('Document saved:', meta._rev), 
    err => { console.error('Failed to save document:', err.errorNum, err.response.body.errorMessage); } 
); 
+0

邏輯看起來很好,但是這段代碼也返回'Promise {0}。任何想法爲什麼? – Prasanna

1

有兩件事情怎麼回事,可能會造成混亂。首先,arangojs(不像ArangoDB的內部JS API)是異步,用於需要與實際的ArangoDB服務器交談的所有內容。文檔中的異步函數被標記爲「異步」。

您可以將node.js樣式的回調(如內置node.js模塊中的異步函數,例如fshttp等)傳遞給這些方法。或者,您可以簡單地省略回調,該方法將返回結果的承諾。您可以詳細瞭解承諾如何工作in Mozilla's JavaScript reference documentation(這不是特定於Mozilla--它們的引用非常好,通常是正確的)。

您遇到的另一件事是arangojs中的集合對象與ArangoDB中的實際集合之間的區別。驅動程序允許您爲集合創建集合對象,而不管它們是否存在。當試圖使用它們,如果集合實際上不存在,你當然會看到一個錯誤。

var col = db.collection('whatever'); 
col.create() // create the collection if it doesn't exist 
.catch(function() {}) // ignore any errors 
.then(function() { 
    return col.get(); // make sure the collection exists now 
}) 
.then(function() { 
    return col.save({some: 'data'}); 
}) 
.then(function (result) { 
    // everything went fine 
}) 
.catch(function (e) { 
    console.error('Something went wrong', e.stack); 
}); 

或者使用異步/等待(如果你用巴貝爾或者從現在看這個答案一年):

var col = db.collection('whatever'); 
try { 
    await col.create(); // create the collection if it doesn't exist 
} catch (e) {} // ignore any errors 
try { 
    await col.get(); // make sure the collection exists now 
    const result = await col.save({some: 'data'}); 
    // everything went fine 
} catch (e) { 
    console.error('Something went wrong', e.stack); 
} 

或者如何使用Node.js風格的回調,因爲你是老校友或很喜歡金字塔:

var col = db.collection('whatever'); 
col.create(function() { // create the collection if it doesn't exist 
    // ignore any errors 
    col.get(function (err) { // make sure the collection exists now 
    if (err) { 
     console.error('Something went wrong', err.stack); 
     return; 
    } 
    col.save({some: 'data'}, function (err, result) { 
     if (err) { 
     console.error('Something went wrong', err.stack); 
     return; 
     } 
     // everything went fine 
    }); 
    }); 
}); 
相關問題