65 votes

Mongoose récupère des données sans le champ _id

Je voudrais récupérer certaines 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 la réponse suivante _id champ. Existe-t-il un moyen de ne pas le récupérer ? C'est ce que je fais actuellement :

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 enregistre-moi les résultats qui contiennent le _id champ.

126voto

VisioN Points 62518

Une autre façon est d'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: '...' }
});

2 votes

Cela semble être la syntaxe la plus élégante.

1 votes

Oui, bien mieux que le premier. Bien joué @VisioN

1 votes

Beaucoup plus élégant ! +1

82voto

danmactough Points 1992

_id doit être spécifiquement exclue. 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);
});

4 votes

Peut-on exclure _id tout en conservant id ? J'ai remarqué que id est un champ virtuel. Je veux avoir id mais exclure _id dans mon api REST. Pour l'instant, lorsque j'exclue _id, id devient nul.

0 votes

Nous pouvons également exclure les _id imbriqués (par exemple, cars._id : 0).

3 votes

Comment exclure _id dans les sous-docs, la commande ci-dessus l'exclut du doc externe mais pas des sous-docs.

23voto

Gábor Imre Points 602

Une autre approche :

  • Augmentez le .toJSON() du schéma qu'il supprime le _id et le __v champs
  • Appelez .toJSON() sur tous les objets de la BD envoyés au client
  • Avantage supplémentaire n°1 : vous pouvez utiliser item.id === 'something' parce que typeof id === 'string' pas ObjectId .
  • Avantage supplémentaire n° 2 : lorsque le client vous a renvoyé l'objet et que vous souhaitez le rechercher ou le mettre à jour, vous n'avez pas à le supprimer manuellement. _id parce qu'il n'y en a pas, juste un id qui est ignorée.

Augmentation de JSON :

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

Donc vous pouvez 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 eue jusqu'à présent.

10voto

Durja Points 467

Dans la version 5.2.13 de Mongoose (sept 2018)- en utilisant l'approche du constructeur 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
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X