2016-11-09 9 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 상태

은 하나의 수집 또는 널 (null) 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 {} '을 반환한다. 왜 그런가? – Prasanna

1

이 혼동 될 수 있습니다 여기에 무슨 두 가지가 있습니다 :이 솔루션은 약속이 해결 될 때까지 기다린 후 오류가 발생 여부에 따라 반응하는 것입니다.

우선 Arangojs (ArangoDB의 내부 JS API와 달리)는 실제 ArangoDB 서버와 통신해야하는 모든 것에 대해 비동기입니다. 비동기 함수는 문서에서 "async"로 표시됩니다.

내장 된 node.js 모듈의 비동기 함수 (예 : fs, http 등)를 node.js 스타일 콜백에 전달할 수 있습니다. 또는 단순히 콜백을 생략 할 수 있으며 메서드는 결과에 대한 약속을 반환합니다. 약속이 작동하는 방법에 대해 자세히 알아볼 수 있습니다 (이 내용은 Mozilla에만 국한된 것은 아니며 그 참조는 매우 훌륭하고 일반적으로 정확합니다). in Mozilla's JavaScript reference documentation

다른 한가지는 arangoj의 컬렉션 객체와 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); 
}); 
(당신이 바벨을 사용하거나 지금부터이 대답을 1 년 읽으면)

또는 비동기를 사용하여/기다리고 :

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를 스타일 콜백을 당신이이기 때문에 oldschool 또는 진짜 좋아해 피라미드 :

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 
    }); 
    }); 
}); 
관련 문제