web-dev-qa-db-fra.com

Comment exclure certains champs du document

J'ai le shema simple suivant:

 var userSchema = new Schema({
    name : String,
   age: Number,
   _creator: Schema.ObjectId
  });

  var User = mongoose.model('User',userSchema);

Ce que je veux faire, c'est créer le nouveau document et le retourner au client, mais je veux exclure le champ "créateur" de l'un:

app.post('/example.json', function (req, res) {
   var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
   user.save(function (err) {
      if (err) throw err;

      res.json(200, {user: user});     // how to exclude the _creator field?
   });
});

À la fin, je veux envoyer le nouvel utilisateur créé sans champ _creator:

{
   name: 'John',
   age: 45
} 

Est-il possible de faire sans requête supplémentaire de recherche de mangouste?

P.S: Il est préférable de le faire par

55
Erik

Une autre façon de gérer cela au niveau du schéma consiste à remplacer toJSON pour le modèle.

UserSchema.methods.toJSON = function() {
  var obj = this.toObject()
  delete obj.passwordHash
  return obj
}

Je suis tombé sur cette question à la recherche d'un moyen d'exclure le hachage de mot de passe du json que j'ai servi au client, et select: false a cassé ma fonction verifyPassword car elle n'a pas récupéré la valeur de la base de données.

69
Charles

La manière documentée est

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        delete ret.password;
        return ret;
    }
});

MISE À JOUR - Vous voudrez peut-être utiliser une liste blanche:

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        var retJson = {
            email: ret.email,
            registered: ret.registered,
            modified: ret.modified
        };
        return retJson;
    }
});
56
Xerri

Venez à travers votre question lorsque j'essayais de trouver une réponse similaire avec pymongo. Il s'avère que dans mongo Shell, avec l'appel de fonction find (), vous pouvez passer un deuxième paramètre qui spécifie à quoi ressemble le document résultat. Lorsque vous transmettez un dictionnaire dont la valeur d'attribut est 0, vous excluez ce champ dans tous les documents issus de cette requête.

Dans votre cas, par exemple, la requête sera comme:

db.user.find({an_attr: a_value}, {_creator: 0});

Il exclura le paramètre _creator pour vous.

Dans pymongo, la fonction find () est à peu près la même. Je ne sais pas comment cela se traduit par mangouste. Je pense que c'est une meilleure solution que de supprimer manuellement les champs par la suite.

J'espère que ça aide.

17
Rex

Vous pouvez appeler toObject() sur le document pour le convertir en un simple objet JS que vous pouvez modifier librement:

user = user.toObject();
delete user._creator;
res.json(200, {user: user});
12
JohnnyHK

J'utiliserais les utilitaires lodash . Pick () ou . Omit ()

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Only get name and age properties
        var userFiltered = _.pick(user.toObject(), ['name', 'age']);
        res.json(200, {user: user});
    });
});

L'autre exemple serait:

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Remove _creator property
        var userFiltered = _.omit(user.toObject(), ['_creator']);
        res.json(200, {user: user});
    });
});
11
fernandopasik

En suivant la documentation de MongoDB, vous pouvez exclure des champs en passant un deuxième paramètre à votre requête comme:

User.find({_id: req.user.id}, {password: 0})
        .then(users => {
          res.status(STATUS_OK).json(users);
        })
        .catch(error => res.status(STATUS_NOT_FOUND).json({error: error}));

Dans ce cas, le mot de passe sera exclu de la requête.

police: https://docs.mongodb.com/v2.8/tutorial/project-fields-from-query-results/#return-all-but-the-excluded-field

5
Leo Ribeiro

J'utilise Mongoosemask et j'en suis très content.

Il prend en charge le masquage et l'exposition de propriétés avec d'autres noms en fonction de vos besoins

https://github.com/mccormicka/mongoosemask

var maskedModel = mongomask.mask (modèle, ['nom', 'âge']); // Et vous avez terminé.

1
fino