2014-04-27 7 views
2

각 특정 필드를 수동으로 설정할 필요없이 mongoose를 사용하여 임베디드 문서를 쉽게 업데이트 할 수있는 방법을 찾고 있습니다. 허용되는 답변 this question을 살펴보면 업데이트 할 임베디드 문서를 찾으면 실제로 각 속성을 설정 한 다음 부모를 저장해야합니다. 내가 원하는 것은 업데이트 객체를 전달하고 MongoDB가 업데이트를 설정하도록하는 것입니다.임베디드 문서 업데이트 mongoose

예컨대 나는 일반 (비 포함) 문서를 업데이트하는 경우 내가 이런 짓을 했을까 : 여기

models.User.findOneAndUpdate({_id: req.params.userId}, req.body.user, function(err, user) { 
    err ? resp.status(500).send(err) : user ? resp.send(user) : resp.status(404).send(); 
}); 

는 사실 req.body.user의 각 속성을 통해 이동하고 변경 사항을 설정할 필요가 없습니다. 하위 문서에서도 이런 종류의 일을 할 수있는 방법을 찾을 수 없습니까?

var UserSchema = BaseUserSchema.extend({ 
    isActivated: { type: Boolean, required: true }, 
    files: [FileSchema] 
}); 

var FileSchema = new mongoose.Schema(
    name: { type: String, required: true }, 
    size: { type: Number, required: true }, 
    type: { type: String, required: true }, 
}); 

을 내가 사용자와 파일 ID를 기반으로 파일을 업데이트하기 위해 노력하고있어 다음과 같이

내 스키마입니다.

값을 설정하는 도우미 함수를 만들어야합니까, 아니면 이것을 수행하는 MongoDB 방법이 있습니까?

감사합니다. 정말

var user = { /* The user information, at least the _id */ 
var filedata = { /* From somewhere with _id, name, size, type */ }; 

models.User.findOneAndUdate(
    { "_id": user._id, "files._id": filedata._id }, 
    { 
     "$set": { 
      "name": filedata.name, 
      "size": filedata.size, 
      "type": filedata.type 
     } 
    }, 
    function(err,user) { 

     // Whatever in here, but the update is already done. 
    } 
); 

또는 :

답변

3

그럼 당신은 변수에 당신 "FILEDATA"가 무엇인가를 가지고 추정, 물론 업데이트하려는 사용자 _id는, 당신은 $set 연산자를 wan't 오직 $set 당신이 의미하는 것을 안다면 실제로 "업데이트"한다는 의미의 필드가 있습니다. 따라서 "크기"만 변경해야한다면 예를 들어 설정하십시오.

+0

안녕하세요. 답변 해주셔서 감사합니다. 아마 내 질문에 내가 분명하지 않은 것 같아. 업데이트 내에서 각 값을 개별적으로 설정할 수 있음을 이해합니다. 하지만 내가하고 싶은 것은 삽입 된 파일 문서에 대한 업데이트가 포함 된 객체를 전달하는 것입니다. 예를 들어 HTTP put 요청을 만들 때 유용합니다. 여기서 사용자가 어떤 업데이트를하고 싶은지 알 수 없습니다. 저장하기 전에 속성을 설정하는 도우미 함수를 작성하지 않고 mongoose/mongodb에서이 작업을 수행 할 수 있습니까? 다시 한번 감사드립니다. – Sherlock

+0

@Sherlock 당신 말이 맞아요, 당신의 질문은 분명하지 않고 그 주석도 아닙니다. 아마도 정확히 무엇을하고 싶은지에 대한 명확한 시연으로 질문을 업데이트해야합니다. 하지만 업데이트 부분에 **'$ set' ** 또는 **'$ push' ** 형식의 구문을 사용하지 않는 한 전체 배열을 바꾸는 것 외에는 다른 작업을 수행 할 수 없습니다. –

+0

제 질문에 대한 답변입니다. 감사. – Sherlock

관련 문제