source

Mongoose 문서를 json으로 변환

manysource 2023. 3. 16. 21:38

Mongoose 문서를 json으로 변환

mongoose docs를 json으로 반환했습니다.

UserModel.find({}, function (err, users) {
    return res.end(JSON.stringify(users));
}

단, 사용자.__syslog__도 반환되었습니다.그거 없이 어떻게 돌아와요?시도했지만 작동하지 않았습니다.

UserModel.find({}, function (err, users) {
    return res.end(users.toJSON());    // has no method 'toJSON'
}

mongoosejs의 lian()을 사용해 볼 수도 있습니다.

UserModel.find().lean().exec(function (err, users) {
    return res.end(JSON.stringify(users));
});

응답이 늦었지만 스키마를 정의할 때도 이 방법을 시도해 볼 수 있습니다.

/**
 * toJSON implementation
 */
schema.options.toJSON = {
    transform: function(doc, ret, options) {
        ret.id = ret._id;
        delete ret._id;
        delete ret.__v;
        return ret;
    }
};

주의:retJSON의 객체이며 mongoose 모델의 인스턴스가 아닙니다.getter/setter 없이 오브젝트 해시에 바로 조작할 수 있습니다.

그 후:

Model
    .findById(modelId)
    .exec(function (dbErr, modelDoc){
         if(dbErr) return handleErr(dbErr);

         return res.send(modelDoc.toJSON(), 200);
     });

편집 : 2015년 2월

누락된 toJSON(또는 toObject) 메서드에 대한 솔루션을 제공하지 않았기 때문에 사용 예시와 OP의 사용 예시의 차이를 설명하겠습니다.

OP:

UserModel
    .find({}) // will get all users
    .exec(function(err, users) {
        // supposing that we don't have an error
        // and we had users in our collection,
        // the users variable here is an array
        // of mongoose instances;

        // wrong usage (from OP's example)
        // return res.end(users.toJSON()); // has no method toJSON

        // correct usage
        // to apply the toJSON transformation on instances, you have to
        // iterate through the users array

        var transformedUsers = users.map(function(user) {
            return user.toJSON();
        });

        // finish the request
        res.end(transformedUsers);
    });

예:

UserModel
    .findById(someId) // will get a single user
    .exec(function(err, user) {
        // handle the error, if any
        if(err) return handleError(err);

        if(null !== user) {
            // user might be null if no user matched
            // the given id (someId)

            // the toJSON method is available here,
            // since the user variable here is a 
            // mongoose model instance
            return res.end(user.toJSON());
        }
    });

일단 한번 해봐.toObject()대신toJSON()아마도요?

둘째, 어레이가 아닌 실제 문서에서 호출해야 하므로 다음과 같은 성가신 작업을 시도해 보십시오.

var flatUsers = users.map(function() {
  return user.toObject();
})
return res.end(JSON.stringify(flatUsers));

추측이지만 그게 도움이 됐으면 좋겠어요.

model.find({Branch:branch},function (err, docs){
  if (err) res.send(err)

  res.send(JSON.parse(JSON.stringify(docs)))
});

나는 내가 실수를 했다는 것을 알았다.Object() 또는 ToJSON()을 호출할 필요가 없습니다.질문의 __proto_는 mongoose가 아닌 jquery에서 나왔습니다.테스트 결과는 다음과 같습니다.

UserModel.find({}, function (err, users) {
    console.log(users.save);    // { [Function] numAsyncPres: 0 }
    var json = JSON.stringify(users);
    users = users.map(function (user) {
        return user.toObject();
    }
    console.log(user.save);    // undefined
    console.log(json == JSON.stringify(users));    // true
}

doc.toObject()는 문서에서 doc.protype을 삭제합니다.그러나 JSON.stringify(doc)에서는 차이가 없습니다.그리고 이 경우에는 필요하지 않습니다.

정답을 잘못 알고 있는 것 같지만, 만약 다른 방법을 찾는 사람이 있다면,Model.hydrate()(mongoose v4 이후) javascript object(JSON)를 mongoose 문서로 변환합니다.

유용한 예는 다음과 같습니다.Model.aggregate(...).실제로 플레인 JS 오브젝트를 반환하고 있기 때문에 mongoose 문서로 변환하여 액세스 할 수 있습니다.Model.method(예를 들어 스키마에 정의된 가상 속성).

추신: "Json을 Mongoose docs로 변환"과 같은 스레드가 실행되어야 한다고 생각했습니다만, 실제로는 그렇지 않습니다만, 답을 알게 되었기 때문에, 자기 포스트 앤 셀프 앤 셀프 앤서(self-post-and-self-answer)를 하는 것은 좋지 않다고 생각합니다.

res.json()을 사용하여 임의의 개체를 jsonify할 수 있습니다.lian()은 mongoose 쿼리의 빈 필드를 모두 삭제합니다.

UserModel.find().lean().exec(function (err, users) { return res.json(users); }

나한테는 효과가 있었어.

Products.find({}).then(a => console.log(a.map(p => p.toJSON())))


또한 getters를 사용하는 경우 (스키마를 정의할 때) 옵션도 추가해야 합니다.

new mongoose.Schema({...}, {toJSON: {getters: true}})

다음 옵션을 사용해 보십시오.

  UserModel.find({}, function (err, users) {
    //i got into errors using so i changed to res.send()
    return res.send( JSON.parse(JSON.stringify(users)) );
    //Or
    //return JSON.parse(JSON.stringify(users));
  }

이게 아주 흔한 일이라는 걸 생각하면 이게 얼마나 번거로운 일인지 잠시 비웃는 것 같았어요

굳이 문서를 파헤치지 않고 대신 이걸 해킹했어요

        const data =   await this.model.logs.find({ "case_id": { $regex: /./, $options: 'i' }})              
        let res = data.map(e=>e._doc)
        res.forEach(element => {
            //del unwanted data
            delete element._id
            delete element.__v
        });
        return res
  1. 먼저 case_id 필드의 값이 전혀 없는 모든 문서를 가져옵니다(컬렉션 내의 모든 문서를 가져옵니다).
  2. 그런 다음 array.map을 통해 mongoose 문서에서 실제 데이터를 가져옵니다.
  3. i를 직접 변환하여 객체의 불필요한 소품 제거

언급URL : https://stackoverflow.com/questions/9952649/convert-mongoose-docs-to-json