2012-11-18 2 views
4

"연락처"라는 하위 문서가 포함 된 mongoose로 사용자 스키마를 설정했습니다. 하위 문서 "연락처"는 실제 연락처 (다른 사용자 개체에 대한 참조)와 "우정"과 관련된 일부 데이터가 포함 된 연락처 개체의 모음입니다.몽구스 : 하위 문서 배열을 대체하려면 어떻게해야합니까?

내 프런트 엔드 응용 프로그램에서 사용자를 내 연락처 목록에 추가하거나 제거하여 연락처를 관리 할 수 ​​있습니다. 프런트 엔드는 이러한 변경 사항을 HTTP PUT 요청으로 서버에 저장합니다.

PUT 요청에는 데이터베이스에서 사용자 개체를 대체하는 전체 사용자 개체가 포함되어 있습니다. 불행히도 하위 모음 컬렉션을 대체 할 수 없습니다. 새로운 것을 밀어 내거나 제거 할 수 있습니다.

var UserSchema = new Mongoose.Schema({ 

    username: { 
     type: String, 
     index: { unique: true, sparse: true }, 
     required: true, lowercase: true, trim: true 
    }, 

    email: { 
     type: String, 
     index: { unique: true, sparse: true }, 
     required: true, lowercase: true, trim: true 
    }, 

    contacts: [ContactSchema] 

}); 

var ContactSchema = new Mongoose.Schema({ 

    user: { 
     ref: "User", 
     type: Mongoose.Schema.ObjectId 
    }, 

    isContact: { 
     type: Boolean, 
     default: true 
    } 

}); 

은 현재 내가 모두를 제거하고 요청에 하나를 추가하여 연락처를 교체하려고 : 여기

는 스키마입니다

app.put('/me', loadUser, function(req, res, next) { 
    var user = req.user; 

    req.user.contacts.forEach(function(contact) { 
     req.body.contacts.forEach(function(contact) { 
      contact.remove(); 
     }); 
    }); 

    req.body.contacts.forEach(function(contact) { 
     req.user.contacts.push(contact); 
    }); 

    user.save(function(err, user) { 
     if (err) return next(err); 
     res.send(200); 
    }); 
}); 

어떻게 내가 할 수있는 사람이 실제로 더 나은 아이디어를 가지고 이 하위 문서 컬렉션을 요청의 상태로 업데이트 하시겠습니까?

+0

전체 개체가 몽고하기 : 당신은 객체 배열로 작업하여 MongoDB에 그냥 힌트

는, 당신은 모든 값을 간단하게 교체 할 수 있습니까? 동일한 문서를 동일한 '_id'로 바꾸려면 덮어 써야합니다. –

답변

4

당신은 객체는 여기 foreach는하지 않고 배열에서 뭔가를 제거하는 방법을 예를

를 제거하려면 필터링 할 _underscore 라이브러리를 사용 (거부) 할 수 있습니다.

var _und = require('underscore'); 

var array = [{_id:1, title:'object one'}, {_id:2, title:'object two'}, {_id:3, title: 'object three' }] 
    the_target = 'object two'; 
    new_array = _und.reject(array, function(item){ 
     return item.title === target; 
    }) 

예상되는 결과는 다음과 같아야합니다

=> [{_id:1, title:'object one'}, {_id:3, title:'object three'}] 

당신이 ID를 알고있는 경우

는, 더 나은.

당신이 다음 할 일은이 수행하여 subdocs을 비어 : 왜 단지 그들을 교체하지 않을 당신이 전체 subdoc 배열을 바꾸려면

var mytargetarray = []; 
    mytargetarray.push(new_array); 
    mytargetarray.save(); 

을 :

req.user.contacts = []; 
req.user.contacts.push(req.body.contacts); 

저장 끝난.

희망이 조금 있습니다. 당신은 전체 사용자 개체를 얻을, 당신은 단지 저장할 수없는 경우

// active data from database 
user.name = 'test user'; 
// now just give the object a new value 
user.name = 'new name'; 
// and save .. done 
user.save(); 
+0

small 편집 : req.user.contacts.push (req.body.contacts); // 같은 [[contacts]]를 생성하지 않습니까? –

+0

배열을 푸시하고 객체 배열이 아닌 경우에만 이 예제에서와 같이 가장 좋은 것은 다시 밑줄을 사용하는 것입니다. _.union (array1, array2)과 같은 몇 가지 명령이 있습니다. 중복 된 항목에 대해서도 2 개의 배열을 비교합니다. 동일한 컨텍스트에서 머물러 있다면 배열을 반복해서 복사해야합니다. 배열 어프 리케이션을 더 이상 사용하지 않습니다. – Daniel