2016-05-03 2 views
1

Я начинаю изучать стек MEAN, и я пытаюсь создать базовый форум, чтобы ознакомиться с этим стеком. До сих пор я получил все, чтобы работать, кроме суб-суб-документов. У меня возникли проблемы с CRUD в комментариях в сообщениях по темам. Я уже много раз искал и ничего не выглядел точно, как мне нужно. Итак, мой вопрос: как бы вы это реализовали? Я знаю, что есть несколько способов сделать это, например, использовать ссылки вместо суб-документов, но, видя, что я уже написал код для таких вещей, как темы CRUD и сообщения CRUD в рамках тем, используя поддоку, я бы скорее, не использовать refs, если мне придется вернуться и изменить свой код.Выполнение CRUD на суб-суб-документах с использованием mongoose

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

ответ

0

Я бы предложил не вставлять ваши объекты слишком глубоко. Возможно, создать коллекцию комментариев, это было бы более удобно. В любом случае, если вы хотите использовать одну операцию mongoose, вам нужно прокручивать сообщения раньше, чтобы знать индекс, который вы хотите обновить. Предположим, что это 0, чтобы удалить комментарий:

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

Вот почему это не совсем то, что вы хотите.

Вы можете изменить непосредственно объект и сохранить его:

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

Не совсем идеально, потому что она не использовать MongoDB индексов и исследований, чтобы сделать эти операции. Но вы можете использовать:

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

Спасибо! Я закончил использовать этот код ... – MarkieMoose

+0

app.put ('/ topics /: topicId/posts /: postId/comments /: commentId', requireLogin, function (req, res) { var topicId = req.params.topicId var postId = req.params.postId; var commentId = req.params.commentId; User.findOne ({"email": req.session.user.email}, function (err, user) { if (user.role == "user" || user.role == "admin") { Тема.findById (topicId, function (err, topic) { topic.posts.id (postId) .comments.id (commentId) .content = req.body.content; topic.save (function (err) { if (err) console.log (err); res.status (204) .end(); }); }) } }); }); – MarkieMoose

+0

Тем не менее, я думаю, что последний пример, который вы дали, кажется самым изящным и простым (и, вероятно, эффективным) способом сделать это, поэтому я, вероятно, изменюсь, чтобы использовать это вместо этого. – MarkieMoose

Смежные вопросы