0

Je souhaite ajouter une propriété supplémentaire state: 'found' à chaque document trouvé dans mongoose. J'ai le code suivant:Comment ajouter une autre propriété à un mongoDB trouvé des documents en utilisant mongoose?

router.get('/all', function(req, res, next) { 
    var allPets = []; 

    FoundPet.find({}, function(err, pets) { 
    pets = pets.map((obj) => { 
     obj.state = 'found'; 
     return obj; 
    }) 
    res.send(pets) 
    }) 
}); 

J'attends d'avoir quelque chose comme ça est revenu:

[ 
    { 
    "_id": "59c7be569a01ca347006350d", 
    "finderId": "59c79570c5362d19e4e64a64", 
    "type": "bird", 
    "color": "brown", 
    "__v": 0, 
    "timestamp": 1506291998948, 
    "gallery": [], 
    "state": "found" // the added property 
    }, 
    { 
    "_id": "59c7c1b55b25781b1c9b3fae", 
    "finderId": "59c79a579685a91498bddee5", 
    "type": "rodent", 
    "color": "brown", 
    "__v": 0, 
    "timestamp": 1506291998951, 
    "gallery": [], 
    "state": "found" // the added property 
    } 
] 

mais je ne peux pas obtenir la nouvelle propriété ajouté avec succès en utilisant le code ci-dessus, est-il une solution pour ça ?

Répondre

3

La raison pour laquelle cela ne fonctionne pas, est que Mongoose renvoie par défaut un modèle pour chaque document renvoyé à partir de la base de données.

Essayez la même chose mais en utilisant lean(), qui renvoie un objet javascript brut à la place.

FoundPet 
    .find({}) 
    .lean() 
    .exec(function(err, pets) { 
     pets.forEach((obj) => { 
      obj.state = 'found'; 
     }); 
     res.send(pets); 
     }); 
+0

Vous n'avez pas besoin utiliser 'Tableau # map' ici, utilisez' Tableau # forEach' à la place. – alexmac

+0

@alexmac, Yup! De plus, un traitement des erreurs doit être fait, mais cela dépend de l'OP. –

0

Une approche serait d'utiliser le cadre d'agrégation dans lequel vous pouvez ajouter le champ supplémentaire en utilisant le pipeline $addFields. Cela vous permet d'ajouter de nouveaux champs aux documents et le pipeline génère des documents contenant tous les champs existants à partir des documents d'entrée et des champs nouvellement ajoutés. Par conséquent, vous pouvez exécuter l'opération globale comme:

router.get('/all', function(req, res, next) {  
    FoundPet.aggregate([ 
     { 
      "$addFields": { 
       "state": { "$literal": "found" } 
      } 
     } 
    ]).exec((err, pets) => { 
     if (err) throw err; 
     res.send(pets); 
    }); 
});