2016-05-03 6 views
1

Ich bin ein Anfänger lernen MEAN Stack und ich versuche, ein grundlegendes Forum zu bauen, um mit diesem Stapel vertraut zu werden. Bis jetzt habe ich alles außer Sub-Sub-Docs zu arbeiten. Ich habe Probleme mit CRUD bei Kommentaren innerhalb von Beiträgen innerhalb von Themen. Ich habe schon viel gesucht und nichts sieht genau so aus, wie ich es brauche. Meine Frage ist also, wie würdest du das umsetzen? Ich weiß, dass es wahrscheinlich mehrere Möglichkeiten gibt, dies zu tun, wie z. B. Refs anstelle von Sub-Sub-Dokumenten, aber da ich bereits Code für Themen wie CRUD-Themen und CRUD-Beiträge in Themen geschrieben habe, verwende ich Sub-Dokumente Verwenden Sie keine Refs, wenn ich zurückgehen und meinen Code ändern müsste.Doing CRUD auf Sub-Sub-Dokumente mit Mungo

var express = require('express'); 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 
var uri = "..."; 
mongoose.connect(uri); 

var CommentSchema = new Schema({ 
    id: ObjectId, 
    content: String, 
    author: UserSchema 
}); 

var PostSchema = new Schema({ 
    id: ObjectId, 
    title: String, 
    author: UserSchema, 
    comments: [CommentSchema] 
}); 

var TopicSchema = new Schema({ 
    id: ObjectId, 
    title: String, 
    moderator: UserSchema, 
    posts: [PostSchema] 
}); 

var Topic = mongoose.model('Topic', TopicSchema); 

var app = express(); 

app.delete('/topics/:topicId/posts/:postId/comments/:commentId', function(req, res) { 
    //What goes here? 
}); 

app.put('/topics/:topicId/posts/:postId/comments/:commentId', function(req, res) { 
    //What goes here? 
}); 

app.post('/topics/:topicId/posts/:postId/comments/:commentId', function(req, res) { 
    //What goes here? 
}); 

app.get('/topics/:topicId/posts/:postId/comments/:commentId', function(req, res) { 
    //What goes here? 
}); 

Antwort

0

Ich würde vorschlagen, Ihre Objekte nicht zu tief einzubetten. Vielleicht erstellen Sie eine Kommentar-Sammlung, es wäre praktischer. Wie auch immer, wenn Sie eine Mungo-Operation verwenden möchten, müssen Sie vorher die Beiträge durchforsten, um den Index zu kennen, den Sie aktualisieren möchten. Nehmen wir an, es ist 0, um den Kommentar zu entfernen:

Topic.findOneAndUpdate(
    { id: req.params.topicId }, 
    { $pull: { 'posts.0.comments': { _id: req.params._id } }}, 
    { safe: true } 
) 

Deshalb ist es nicht wirklich das, was Sie wollen.

Sie können das Objekt direkt ändern und speichern:

Topic.findOne({ _id: req.params.topicId }) 
    .then(topic => { 

    const { posts } = topic 
    let comments 
    for (let i = 0, l = posts.length; i < l; ++i) { 

     if (posts[i]._id.toString() === req.params.postId) { 
     comments = posts[i].comments 
     for (let j = 0, m = comments.length; j < m; ++j) { 
      if (comments[j]._id.toString() === req.params.commentId) { 
      comments.splice(j, 1) 
      break 
      } 
     }) 

     break 
     } 

    } 

    return topic.save() 
    }) 

Nicht wirklich ideal, weil es nicht mongodb Indizes und Forschung nicht nutzen, um diese Operationen zu machen. Aber Sie könnten verwenden:

const CommentSchema = new Schema({ 
    id: ObjectId, 
    postId: ObjectId, 
    content: String, 
    author: UserSchema 
}) 

const Comment = mongoose.model('Comment', CommentSchema) 

Comment.findOneAndUpdate({ id: req.params.commentId, postId: req.params.postId }, { ... }) 
+0

Vielen Dank! Ich habe diesen Code verwendet ... – MarkieMoose

+0

app.put ('/ topics /: topicId/posts /: postId/Kommentare /: commentId', requireLogin, Funktion (req, res) { var topicId = req.params.topicId ; var postId = req.params.postId; var commentId = req.params.commentId; User.findOne ({"email": req.session.user.email}, Funktion (err, user) { if (user.role == "Benutzer" || user.role == "admin") { Topic.findById (topicId, Funktion (Fehler, Thema)) { topic.posts.id (postId) .comments.id (commentId) .content = req.body.content; topic.save (funktion (err)) { if (err) console.log (fehler); res.status (204) .end(); }); }) ; } }); }); – MarkieMoose

+0

Ich denke jedoch, dass das letzte Beispiel, das du gabst, die eleganteste und geradlinigste (und wahrscheinlich auch effizienteste) Art ist, es zu tun, also werde ich es wahrscheinlich ändern, um es stattdessen zu verwenden. – MarkieMoose