Mongoose로 업데이트된 컬렉션 반환
나는 nodejs/express/mongoose/angularjs와 함께 일합니다.목록이라는 이름의 컬렉션을 업데이트하고 싶습니다. 목록에는 항목 배열이 포함되어 있습니다.다음 코드에서 항목 배열의 새 작업 항목을 푸시하고 있습니다.모든 것이 정상적으로 작동하지만 업데이트 기능이 업데이트된 컬렉션을 다시 보내지 않으면 데이터베이스에서 다른 쿼리를 수행해야 합니다.이것을 하는 더 효율적인 방법이 있습니까?
nodejs/express 코드:
exports.addTaskToList = function(req, res) {
var listId = req.params.Id;
var taskId = req.params.TaskId;
Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){
if(err) {
console.log('Error updating todo list. ' + err);
}
else{
console.log(result + ' todo list entry updated - New task added');
Lists.findById(listId).populate('items').exec(function (err, updatedEntry) {
if (err) {
console.log('Unable to retrieve todo list entry.');
}
res.send(JSON.stringify(updatedEntry));
});
}
});
};
또한 배열 항목은 ObjectId의 배열입니다.이러한 항목은 별도의 스키마에 있으므로 별도의 컬렉션에 있습니다._id 뿐만 아니라 전체 개체를 푸시하여 다른 컬렉션이 생성되지 않도록 할 수 있습니까?
findOneAndUpdate() 메서드를 사용하고 쿼리 매개 변수에서 {new}: true}(으)로 사용 옵션을 사용합니다.
return this.sessionModel
.findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true})
.exec()
.then(data=>{
return {
sid: data.session_id
}
})
업데이트 방법이 업데이트된 문서를 반환하지 않습니다.
그러나 응용프로그램에 반환된 문서가 필요하지 않고 데이터베이스의 속성을 직접 업데이트하려는 경우 Model#update가 적합합니다.
문서를 업데이트하고 반환해야 하는 경우 다음 옵션 중 하나를 고려하십시오.
기존 접근 방식:
Lists.findById(listId, function(err, list) {
if (err) {
...
} else {
list.items.push(taskId)
list.save(function(err, list) {
...
});
}
});
더 짧은 접근 방식:
Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) {
...
});
마지막 질문과 관련하여:
_id 뿐만 아니라 전체 개체를 푸시하여 다른 컬렉션이 생성되지 않도록 할 수 있습니까?
답은 '그렇다'입니다.Mongoose(여기에 있는 하위 문서의 문서)를 사용하여 하위 문서를 문서 내에 매우 쉽게 저장할 수 있습니다.스키마를 조금만 변경하면 항목뿐만 아니라 전체 항목 개체를 푸시할 수 있습니다._id
목록 스키마에 정의된 항목 배열로 이동합니다.그러나 스키마를 다음과 같이 수정해야 합니다.
var itemSchema = new Schema({
// Your Item schema goes here
task: 'string' // For example
});
var listSchema = new Schema({
// Your list schema goes here
listName: String, // For example...
items: [itemSchema] // Finally include an array of items
});
를 추가함으로써item
에 대한 반대.items
목록의 속성을 선택한 다음 해당 목록을 저장합니다. 새 항목은 목록 컬렉션에 유지됩니다.예를들면,
var list = new List({
listName: "Things to do"
});
list.items.push({
task: "Mow the lawn"
});
list.save(function(error, result) {
if (error) // Handle error
console.log(result.list) // Will contain your item instance
});
그래서 당신이 목록을 로드할 때,items
속성이 항목 배열로 미리 채워집니다.
이는 항목이 더 이상 별도의 컬렉션을 유지하지 않기 때문입니다.이 문서는 목록의 하위 문서로 목록 컬렉션에 지속됩니다.
언급URL : https://stackoverflow.com/questions/20667739/return-updated-collection-with-mongoose
'programing' 카테고리의 다른 글
판다 - 사전에서 데이터 프레임에 새 열 추가 (0) | 2023.07.17 |
---|---|
오라클에서 'as' 키워드를 사용하여 테이블에 별칭을 지정하는 방법은 무엇입니까? (0) | 2023.07.17 |
도커 합성이 있는 잘못된 문자 만들기 컨테이너 (0) | 2023.07.17 |
python-requests 모듈의 모든 요청 기록 (0) | 2023.07.17 |
pathlib.path에서 지정된 파일이 있는 폴더 이름을 가져오는 방법은 무엇입니까? (0) | 2023.07.17 |