2017-12-30 17 views
0

나는 MongoDB를 가지고있는 필드의 이름을 변경하고 난 다음 스키마 갖고 싶어 :어떻게 함수 인수 MongoDB를

directory: { 
    "file1": "id", 
    "directory1":{ 
     "file1": "..." 
     "file2": "..." 
     "file3": "..." 
     "direcrtory1": {} 
    } 
} 

내 질문은 : 내가 함수의 필드 이름을 선택 할 수있는 방법을 $ 다음 함수에 대한 인수로 푸시?

function createFile(projectId,filename,id){ 
     return Project.updateOne({projectId:projectId},{$push:{directory:{filename: id}}}); 
} 

위의 코드는 데이터베이스에이를 만듭니다

"directory": [ 
    { 
     "id": "someID", 
     "filename": "something" 
    } 

지금, 나는 '파일 이름이'그런 식으로 지명 될 싶지 않아요. 함수를 통해 전달 된 값으로 이름을 지정하고 싶습니다.

예 : 함수에서 다음 매개 변수 (someID, 'something', anotherId )를 얻으면 'filename'이됩니다. anotherId '이고, 출력하고 싶습니다 :'something ':'anotherId '. 어떻게해야합니까?

어떤 도움을 주시면 감사하겠습니다

솔루션 :

var update = {$set:{}}; 
update.$set[filename] = id; 
Project.updateOne({projectId: projectId},update,{upsert: true}); 
+0

업데이트 샘플에서 몽구스도 사용하고있는 것 같습니다. 맞습니까? – Paul

+0

네, 맞습니다. –

답변

0

몽구스 스키마를 사용하는 포인트는 몽고 컬렉션 객체의 모양을 적용하는 것입니다. 스키마를 준수하지 않는 필드는 유지되지 않습니다. 각각의 저장된 오브젝트가 설명하는 것처럼 서로 다른 필드를 갖기를 원하면 MongoClient를 직접 사용하여 일반 JS 오브젝트를 저장하거나 변수 이름이 필요한 스키마에서 혼합 유형을 정의해야합니다.

후자를 수행하는 경우 저장하기 전에 markModified()에 전화하여 Mongoose가 변경 사항을 인식하도록해야한다는 점에 유의하십시오.

Mongoose에 대한 예를 추가했습니다. 내가 한 말대로 할거야.

const DirectorySchema = new Schema({ 
      path: String, 
      contents: Mixed 
    }); 

그런 다음 "내용"필드는 사용자가 원하는대로 저장할 수 있습니다,하지만 당신은 그 스키마를 기반으로 모델을 저장하기 전에 markModified를 호출해야합니다.

+0

제 데이터베이스에 등록 할 때마다 다른 필드 이름을 사용할 수 없습니까? –

+0

내가 말했듯이 임베디드 문서에서 임베디드 문서가 혼합 데이터 형식으로 등록되어 있거나 Mongoose를 사용하지 않아도 가능합니다. 데이터베이스는 상관하지 않지만 Mongoose는 스키마를 적용합니다. – Paul

+0

어떻게 할 수 있습니까? –