0

Ich möchte eine zusätzliche Eigenschaft state: 'found' zu jedem gefundenen Dokument in Mungo hinzufügen. Ich habe den folgenden Code:Wie füge ich eine andere Eigenschaft zu einer mongoDB hinzu?

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

Ich erwarte etwas zu haben, wie dies zurückgegeben:

[ 
    { 
    "_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 
    } 
] 

aber ich kann nicht die neue Eigenschaft erhalten wurde hinzugefügt den obigen Code verwendet wird, ist es eine Lösung dafür ?

Antwort

3

Der Grund, warum es nicht funktioniert, ist, weil Mongoose standardmäßig ein Modell für jedes Dokument zurückgibt, das von der Datenbank zurückgegeben wird.

Versuchen Sie dasselbe, aber verwenden Sie lean(), die stattdessen ein einfaches JavaScript-Objekt zurückgibt.

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

Sie brauchen nicht zu verwenden 'Array # map' hier, verwenden Sie' Array # forEach' statt. – alexmac

+0

@alexmac, Yup! Es muss auch eine Fehlerbehandlung durchgeführt werden, aber das hängt vom OP ab. –

0

Ein Ansatz wäre die Aggregation Rahmen zu verwenden, in dem Sie das zusätzliche Feld die $addFields-Pipeline hinzufügen können. Dadurch können Sie neue Felder zu Dokumenten hinzufügen, und die Pipeline gibt Dokumente aus, die alle vorhandenen Felder aus den Eingabedokumenten und neu hinzugefügten Feldern enthalten. Daher können Sie das Aggregat Operation ausgeführt wird:

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