使用猫鼬对子文档进行CRUD
Doing CRUD on sub-sub-documents using mongoose
我是一个学习 MEAN 堆栈的初学者,我正在尝试建立一个基本论坛以熟悉这个堆栈。到目前为止,除了子子文档之外,我已经完成了所有工作。我在对主题内帖子内的评论进行 CRUD 时遇到问题。我已经进行了大量搜索,但没有任何内容符合我的需要。所以我的问题是,你将如何实施呢?我知道可能有多种方法可以做到这一点,例如使用 refs 而不是 sub-sub-docs,但鉴于我已经使用子文档为 CRUD 主题和主题内的 CRUD 帖子编写了代码,我会如果我必须返回并更改我的代码,而不是使用 refs。
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?
});
我建议不要将您的对象嵌入太深。也许创建一个评论集合,它会更方便。
无论如何,如果你想使用一个 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 }, { ... })
我是一个学习 MEAN 堆栈的初学者,我正在尝试建立一个基本论坛以熟悉这个堆栈。到目前为止,除了子子文档之外,我已经完成了所有工作。我在对主题内帖子内的评论进行 CRUD 时遇到问题。我已经进行了大量搜索,但没有任何内容符合我的需要。所以我的问题是,你将如何实施呢?我知道可能有多种方法可以做到这一点,例如使用 refs 而不是 sub-sub-docs,但鉴于我已经使用子文档为 CRUD 主题和主题内的 CRUD 帖子编写了代码,我会如果我必须返回并更改我的代码,而不是使用 refs。
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?
});
我建议不要将您的对象嵌入太深。也许创建一个评论集合,它会更方便。 无论如何,如果你想使用一个 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 }, { ... })