Преобразование документов Mongoose в json - программирование
Подтвердить что ты не робот

Преобразование документов Mongoose в json

Я вернул mongoose docs как json таким образом:

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

Однако, пользователь.__ proto__ также был возвращен. Как я могу вернуться без него? Я пробовал это, но не работал:

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

Ответ 1

Вы также можете попробовать mongoosejs lean():

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

Ответ 2

Поздний ответ, но вы также можете попробовать это при определении вашей схемы.

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

Обратите внимание, что ret - объект JSON, и это не экземпляр модели мангуста. Вы будете работать на нем прямо на хэшах объектов, без геттеров/сеттеров.

И затем:

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

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

Изменить: февраль 2015

Поскольку я не предоставлял решение отсутствующего метода 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 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());
        }
    });

Ответ 3

Прежде всего, попробуйте toObject() вместо toJSON(), возможно?

Во-вторых, вам нужно будет называть его фактическими документами, а не массивом, поэтому, возможно, попробуйте что-то более раздражающее:

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

Это догадка, но я надеюсь, что это поможет

Ответ 4

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

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

Ответ 5

Я узнал, что допустил ошибку. Там нет необходимости вызывать toObject() или toJSON() вообще. __proto__ в вопросе исходил от 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.prototype из документа. Но это не имеет никакого значения в JSON.stringify(doc). И это не нужно в этом случае.

Ответ 6

Может быть, немного в заблуждении относительно ответа, но если кто-то хочет сделать наоборот, вы можете использовать Model.hydrate() (начиная с mongoose v4), чтобы преобразовать объект javascript (JSON) в документ mongoose.

Полезный случай будет при использовании Model.aggregate(...). Поскольку он на самом деле возвращает простой JS-объект, вы можете преобразовать его в документ Mongoose, чтобы получить доступ к Model.method (например, вашему виртуальному свойству, определенному в схеме).

PS. Я думал, что должен быть поток, работающий как "Преобразовать JSON в документы Mongoose", но на самом деле нет, и так как я нашел ответ, то я думаю, что это не очень хорошо делать пост-пост и-я-ответ.

Ответ 7

Вы можете использовать res.json() для jsonify любого объекта. lean() удалит все пустые поля в запросе мангуста.

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

Ответ 8

Попробуйте следующие параметры:

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

Ответ 9

У меня это сработало:

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


также, если вы хотите использовать геттеры, вы должны также добавить его опцию (при определении схемы):

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