0

큰 brainfart 순간을 보내고 싶습니다. 하지만 여기에 내 상황이 다가옵니다.하위 문서가 기본적으로 mongodb 문서를 만듭니다?

여러 대의 컴퓨터와 코어를 다룰 수 있기를 바랍니다. 사이트마다, 내가 다른 Front 페이지를 가지고, 나는 (전편 stackoverflow 전선 stackoverflow.com/questions/tagged/javascript 및 stackoverflow.com/questions/tagged/nodejs 줄) 사이트를 위해 exmpl.

article 모든 Front에있을 수 있고 내가 기사를 발견 할 때 URL을 알 수없는 경우 I는 Article을 만들려는 알고있는 경우, 내가 article.discoverFront 항목을 만들고 싶어 Front를 알 수없는 경우와 그렇지 않은 경우 내 FrontDiscovery를 삽입 적절한대로 Front.

내 스키마는 다음과 같습니다.

FrontDiscovery = new Schema({ 
    _id   :{ type:ObjectId, auto:true }, 
    date  :{ type: Date, default:Date.now}, 
    dims  :{ type: Object, default:null}, 
    pos   :{ type: Object, default:null} 
}); 

Front = new Schema({ 
    _id   :{ type:ObjectId, auto:true }, 
    url   :{type:String}, //front 
    found  :[ FrontDiscovery ] 
}); 

Article = new Schema({ 
    _id   :{ type:ObjectId, auto:true }, 
    url   :{ type: String , index: { unique: true } }, 
    site  :{ type: String }, 
    discover:[ Front] 
}); 

문제점 결국 나는 결국 경쟁 상태에 빠질 것이라고 생각하고 있습니다. 2 명의 직업 주자가 (평행하게) 동일한 기사를 찾고 (알려지지 않은 상태에서) 기사를 작성하고 새로운 기사를 만듭니다. 그렇습니다. 고유 한 색인을 가지고 있으며 그렇게 처리 할 수 ​​있습니다 - 매우 비현실적입니다.

하지만 더 멀리 할 수 ​​있습니다. 언제 - 이유가 무엇인지 - 내 2 명의 직업 주자가 같은 앞면을 동시에 긁어 모으고 있습니다. 둘 다 Front에 대해 아직 항목이없고 FrontDiscovery을 추가하는 새 항목을 만들면 두 항목으로 끝납니다. 동일 Front.

이러한 상황을 피하기위한 전략은 무엇입니까? upsert : findByIdAndUpdate : 각 문서마다 별도로 true? 만약 그렇다면, 어떻게 만 임베디드 문서 컬렉션으로 밀어 넣을 수 있고, 동시에 다른 모든 것을 덮어 쓰지 않고, 생성되지 않았다면 디폴트를 생성 할 수 있습니까?

올바른 방향으로 나를 안내해 주셔서 감사합니다! 나는 방대한 뇌파를 가지고 있기를 정말로 바란다.

답변

1

upsert=true으로 업데이트하면 원자 "삽입 또는 업데이트"(http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag)를 수행 할 수있다. 우리는 같은 것을 실행할 수 있습니다 예를 들어

우리가 반드시 특정 url 전면 컬렉션의 문서가 정확히 한 번만 삽입되어 있는지 확인하려는 경우 : MongoDB의에서 하나의 문서에

db.Front.update(
    {url: 'http://example.com'}, 
    {$set: { 
     url: 'http://example.com'}, 
     found: true 
    } 
) 

작업은 항상 원자이다. 여러 문서에 걸쳐 업데이트를 수행하면 원 자성이 보장되지 않습니다. 그런 경우에는 스스로에게 질문 할 수 있습니다. 대답이 '아니요'인 경우 잠재적으로 일치하지 않는 데이터로 작업하는 것이 좋습니다. 대답이 '예'이고 MongoDB를 고수하고 싶다면 Two Phase Commits에서 디자인 패턴을 확인하십시오.

+0

답변 해 주셔서 감사합니다. 하지만 지금 또 다른 문제가 있습니다. 이 코드를 사용하여 기사 (및 Front)를 찾으면 아티클을 작성하고 새로운 Front를 푸시해야합니다. 그러나 "MongoError : $ push/$ pushAll 수정자를 비 배열에 적용 할 수 없습니다. "오류 'dbArticle.findOneAndUpdate은 ({ URL : article.url는 "discover.url "article.front 은}, { 설정 $ { URL을 : 기사를.URL, 사이트 : 사이트 }, $ 푸시 : { 발견 : 새로운 dbArticleFront을 ({ URL : article.front }) }, {upsert : TRUE}, 기능 (ERR, 결과) {' – japrescott

+0

검색 필드가 배열이 아닌 값으로 설정되어 있지 않은지 확인하십시오. – christkv

관련 문제