web-dev-qa-db-fra.com

Mongoose récupérant des données sans champ _id

Je voudrais récupérer des données d'un paramètre Mongoose dans mon application Node.js. J'ai remarqué que peu importe ce que j'écris comme sélection de champ, j'obtiens toujours le _id champ. Existe-t-il un moyen de ne pas le récupérer? Voici comment je fais en ce moment:

Transaction.find({username : user.username}, ['uniqueId', 'timeout', 'confirmation_link', 'item_name'], function(err, txs){
        console.log("user : " + user.username + " with txs: " + txs);
        callback(txs);
});

Et me enregistre les résultats qui contiennent le _id champ.

44
Masiar

_id doit être spécifiquement exclu. Par exemple,

Transaction.find({username : user.username}, { '_id': 0, 'uniqueId' :1, 'timeout': 1, 'confirmation_link': 1, 'item_name': 1}, function(err, txs){
  console.log("user : " + user.username + " with txs: " + txs);
  callback(txs);
});
56
danmactough

Une autre façon consiste à utiliser l'argument texte avec le préfixe - qui exclura tel ou tel champ du résultat:

Entity.find({ ... }, '-_id field1 field2', function(err, entity) {
    console.log(entity);  // { field1: '...', field2: '...' }
});
85
VisioN

Une autre approche:

  • Augmentez la .toJSON() du schéma en supprimant les champs _id Et __v
  • Appelez .toJSON() sur tous les objets DB envoyés au client
  • Avantage supplémentaire # 1: vous pouvez utiliser item.id === 'something' Parce que typeof id === 'string', Pas ObjectId.
  • Avantage supplémentaire n ° 2: lorsque vous avez récupéré un objet gan du client et que vous souhaitez rechercher/mettre à jour, vous n'avez pas à supprimer manuellement _id Car il n'y en a pas, juste un id qui est ignoré.

Augmenter JSON:

mySchema.set('toJSON', {
    virtuals: true,
    transform: (doc, ret, options) => {
        delete ret.__v;
        ret.id = ret._id.toString();
        delete ret._id;
    },
});

Vous pouvez donc utiliser:

 let item = (await MyCollection.findOne({/* search */}).exec()).toJSON();
 if (item.id === 'someString') return item;

Je sais que c'est moche. Mais c'est la meilleure mauvaise idée que j'ai jusqu'à présent.

12
Gábor Imre

Dans la version 5.2.13 de Mongoose (septembre 2018) - en utilisant l'approche du générateur de requêtes, la même chose peut être convertie en

async function getUserDetails(user) {
    try {
        if (!user || !user.name) return;
        const result = await Transaction.
        find({username : user.username}).
        select('uniqueId timeout confirmation_link item_name -_id'); 
        // Adding minus sign before the _id (like -_id) in the select string unselects the _id which is sent by default. 
        console.log(result);
    } catch(ex) {
        return ex
    }
}
3
Durja Arai