2016-03-22 21 views
0

Wenn ein Benutzer eine Frage speichert, kann die Frage ein Array von "Tags" enthalten. Ich möchte dieses Array von Tags verwenden und prüfen, ob sie in der Tag-Sammlung vorhanden sind. Wenn die Tags vorhanden sind, aktualisieren Sie die Anzahl, falls nicht, fügen Sie sie der Auflistung hinzu. Ich habe Code geschrieben, um dies zu tun, aber es scheint sehr ausführlich. Gibt es einen besseren/leichteren/prägnanteren Weg, dies mit Mongo/Mungo zu machen? Die Funktionsweise ähnelt der Funktionsweise des Stack-Überlaufs beim Tagging.MongoDB Mongoose speichern oder aktualisieren mit Array

apiRouter.post('/', function(req, res) { 
    var question = new Questions(); 

    question.text = req.body.text; 
    question.answers = req.body.answers; 
    question.tech = req.body.tech; 
    question.tags = req.body.tags; 
    question.level = req.body.level; 
    question.createdAt = req.body.createdAt; 

    question.save(function(err, questions) { 
     if(err) res.send(err); 
     res.json({message: "Question was created."}); 
    }); 

    for each(tag in req.body.tags) { 
     QuestionTags.find({ 'tag': { $regex: new RegExp(tag, "i") } }, function(err, tags) { 
      if(err) res.send(err); 
      if(tags.length === 0) { 
       var tagObj = new QuestionTags(); 
       tagObj = { 
        tag: tag, 
        count: 0 
       } 
       tagObj.save(function(err, questions) { 
        if(err) res.send(err); 
        res.json({message: "Tag created"}); 
       }); 
      } else { 
       var tagObj = new QuestionTags(); 
       tagObj = tags; 

       tagObj.count++; 

       tagObj.save(function(err, questions) { 
        if(err) res.send(err); 
        res.json({message: "Tag updated"}); 
       }) 
      } 
     }) 
    } 
}); 

Antwort

1

können Sie den Ausdruck MongoDB $in Operator verwenden, wenn find() mit stream() von der API Mongoose verwenden. find() gibt ein Objekt Query zurück, das dann verwendet werden kann, um ein QueryStream (das die Node.js ReadableStream Schnittstelle implementiert) zu erstellen. Sie können dann .on verwenden, um jedes Stream-Ereignis zu verarbeiten.

Beachten Sie, dass Sie den Operatorausdruck $regex nicht innerhalb eines Ausdrucks $in verwenden können. Sie müssen sich darum kümmern, bevor Sie das Array an find() übergeben.

apiRouter.post('/', function(req, res) { 
    var question = new Questions(); 

    question.text = req.body.text; 
    question.answers = req.body.answers; 
    question.tech = req.body.tech; 
    question.tags = req.body.tags; 
    question.level = req.body.level; 
    question.createdAt = req.body.createdAt; 

    question.save(function(err, questions) { 
     if(err) res.send(err); 
     res.json({message: "Question was created."}); 
    }); 

    var tagsRegExp = []; 

    req.body.tags.forEach(function(tag) { 
     tagsRegExp.push(new RegExp(tag, "i"); 
    } 

    QuestionTags.find({ 'tag': { $in : tagsRegExp }}).stream() 
     .on('error', function(err) { 
      res.send(err); 
     }).on('data', function(tag) { 
      if(tag.length === 0) { 
       var tagObj = new QuestionTags(); 
       tagObj = { 
        tag: tag, 
        count: 0 
       } 
       tagObj.save(function(err, questions) { 
        if(err) res.send(err); 
        res.json({message: "Tag created"}); 
       }); 
      } else { 
       var tagObj = new QuestionTags(); 
       tagObj = tag; 

       tagObj.count++; 

       tagObj.save(function(err, questions) { 
        if(err) res.send(err); 
        res.json({message: "Tag updated"}); 
       }); 
      } 
     }); 
    }); 
+0

Das funktioniert nicht ganz ... Alles in 'QuestionTags.find' wird nicht mehr angewendet, da es nicht mehr in forEach ist. Wenn 'tagsRegExp' 6 Tags enthält und 5 davon in der Sammlung vorhanden sind, erhalten Sie diese 5 Tags in der Abfrageantwort zurück. Das hilft nicht beim Erstellen eines neuen Tags für etwas, das nicht existiert. – erichardson30

+0

@ erichardson30 Ich habe den Code und die Erklärung mit Mungo 'QueryStream' auf dem' Query' Objekt, das von 'find()' zurückgegeben wurde, aktualisiert. – roflmyeggo

+0

das speichert nichts in der FrageTags-Sammlung – erichardson30

Verwandte Themen