Convertir Mangouste docs en json

J'ai retourné mongoose docs comme json de cette façon:

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

Cependant, utilisateur.__ proto_ _ a également été retourné. Comment puis-je retourner, sans elle? J'ai essayé cela mais pas travaillé:

UserModel.find({}, function (err, users) {
    return res.end(users.toJSON());    // has no method 'toJSON'
}
53
demandé sur Trantor Liu 2012-03-31 07:02:12

8 réponses

Vous pouvez également essayer Lean de mongoosejs() :

UserModel.find().lean().exec(function (err, users) {
    return res.end(JSON.stringify(users));
}
108
répondu ecdeveloper 2013-10-20 11:13:51

Réponse tardive mais vous pouvez également essayer ceci lors de la définition de votre schéma.

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

Notez que ret est l'objet JSON'ED, et ce n'est pas une instance du modèle mongoose. Vous allez l'opérer directement sur les hachages d'objets, sans getters / setters.

Puis:

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

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

Modifier: Février 2015

Parce que je n'ai pas fourni de solution aux méthodes tojson (ou toObject) manquantes, je vais expliquer la différence entre mon exemple d'utilisation et L'utilisation D'OP exemple.

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);
    });

Mon Exemple:

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());
        }
    });
41
répondu eAbi 2015-02-18 10:53:41

Tout d'Abord, essayez de toObject() au lieu de toJSON() peut-être?

Deuxièmement, vous devrez l'appeler sur les documents réels et non sur le tableau, alors essayez peut-être quelque chose de plus ennuyeux comme ceci:

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

C'est une supposition, mais j'espère que ça aide

22
répondu Jamund Ferguson 2012-03-31 04:53:24
model.find({Branch:branch},function (err, docs){
  if (err) res.send(err)

  res.send(JSON.parse(JSON.stringify(docs)))
});
11
répondu Fabio Guerra 2014-10-28 20:13:53

J'ai découvert que j'avais fait une erreur. Il n'est pas nécessaire d'appeler toObject () ou toJSON () du tout. Le _ _ proto__ dans la question est venu de jquery, pas de mangouste. Voici mon test:

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 () supprime doc.prototype à partir d'un doc. Mais cela ne fait aucune différence dans JSON.stringify (doc). Et ce n'est pas nécessaire dans ce cas.

5
répondu Trantor Liu 2012-03-31 14:05:42

Peut-être un peu égaré par la réponse, mais si quelqu'un cherche à faire l'inverse, vous pouvez utiliser Model.hydrate() (depuis mongoose v4) pour convertir un objet javascript (JSON) en un document mongoose.

Un cas utile serait lorsque vous utilisez Model.aggregate(...). Parce qu'il retourne en fait un objet JS simple, vous pouvez donc le convertir en un document mongoose afin d'avoir accès à Model.method (par exemple, votre propriété virtuelle définie dans le schéma).

PS. Je pensais qu'il devrait avoir un fil courir comme " Convert JSON to Mongoose docs ", mais en fait pas, et puisque j'ai trouvé la réponse, donc je pense qu'il n'est pas bon de faire auto-post-et-auto-réponse.

2
répondu Leo Li 2018-03-22 18:03:19

Vous pouvez utiliser res. json () pour jsonifier n'importe quel objet. lean () supprimera tous les champs vides de la requête mongoose.

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

0
répondu bindaas 2016-09-22 12:52:18

Essayez cette option:

  UserModel.find({}, function (err, users) {
    return res.end( JSON.parse(JSON.stringify(users)) );
    //Or: 
    //return JSON.parse(JSON.stringify(users));
  }
0
répondu Dudi 2017-08-22 15:01:58