programing

Mongoose로 업데이트된 컬렉션 반환

topblog 2023. 7. 17. 20:31
반응형

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

반응형