programing

mongoose에서 중첩된 개체 업데이트 중

itmemos 2023. 7. 11. 21:35
반응형

mongoose에서 중첩된 개체 업데이트 중

중첩된 개체에 대한 많은 질문을 검색했지만 어레이와 관련된 모든 정보를 찾았습니다.

mongoose에서 업데이트 중인 단순 중첩 개체를 찾고 있습니다.

여기서 http://mongoosejs.com/docs/guide.html

there is an example schema :
var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

일단 문서가 만들어지면,

나중에 즐겨찾기 번호를 변경하려면 어떻게 해야 합니까?

제가 찾을 수 있는 동일한 문서가 없습니다.

제가 한 일은 이렇습니다.

blog.findById(entityId, function(err, mainDoc){
      if(err || !mainDoc) return next(err || 'Document not found');
      var subDoc = mainDoc['meta'];
      if(subDoc){
        subDoc = _.extend(subDoc, { favs : 56 }); //_ lib already available
        console.log(mainDoc.get('meta')); //Prints the updated result with favs = 56  OK
        mainDoc.save(function(err, doc){
           console.log(doc.get('meta')); // prints the updated results with favs = 56 OK
        });
      } else next('Not found');
    });

모든 것이 파일로 작동하고 모든 콘솔이 원하는 결과를 제공합니다.

그러나 mongoose 콘솔로 전환하여 문서를 조회해도 업데이트된 결과가 나타나지 않습니다.

저는 동일한 목표를 달성하기 위한 다른 방법이 있을 수 있다는 것을 알고 있지만, 저는 단지 이 특정 코드에서 제가 잘못하고 있는 것을 찾고 있을 뿐입니다.

문서를 저장한 후 콘솔이 데이터베이스에서 일치하지 않는 데이터를 제공하는 이유는 무엇입니까?

mongoose 디버그 옵션을 활성화했을 때 쿼리에 업데이트할 데이터가 없습니다.빈 $set로 쿼리가 실행됩니다.$set: {}

만약 당신이 단지 값을 변경하고 싶다면.favs간단한 쿼리를 사용할 수 있습니다.

blog.findByIdAndUpdate(entityId, {$set: {'meta.favs': 56}}, function(err, doc) {
    console.log(doc);
});

제가 늦지 않고 누군가를 도울 수 있기를 바랍니다.이 기능은 중첩된 심층 객체에서도 작동합니다.제한 없음.

    const updateNestedObjectParser = (nestedUpdateObject) => {
    const final = {

    }
    Object.keys(nestedUpdateObject).forEach(k => {
        if (typeof nestedUpdateObject[k] === 'object' && !Array.isArray(nestedUpdateObject[k])) {
            const res = updateNestedObjectParser(nestedUpdateObject[k])
            Object.keys(res).forEach(a => {
                final[`${k}.${a}`] = res[a]
            })
        }
        else
            final[k] = nestedUpdateObject[k]
    })
    return final
}

    console.log(updateNestedObjectParser({
    a: {
        b: {
            c: 99
        },
        d: {
            i: {
                l: 22
            }
        }
    },
    o: {
        a: 22,
        l: {
            i: "ad"
        }
    }
}))

문제는 일단 mongoose의 데이터를 고객에게 보내는 것 외에는 가지고 있는 것으로 아무것도 할 수 없다는 것입니다.

그러나 정보를 업데이트하고 원하는 대로 사용할 수 있도록 만드는 희박한 방법이 있습니다.

이는 다음과 같습니다.

blog.findById(entityId).lean().exec(function (err, mainDoc) {
    if (err || !mainDoc) {
        return next(err || 'Document not found');
    }
    var subDoc = mainDoc.meta;
    if(subDoc){
        subDoc.favs = 56;
        blog.update({_id: entityId}, mainDoc, function(err, doc){
            console.log(doc.get('meta'));
        });
    } else {
        next('Not found');
    }
});

언급URL : https://stackoverflow.com/questions/23832921/updating-nested-object-in-mongoose

반응형