gpt4 book ai didi

javascript - 如何删除MongoDB中的文档和所有嵌入文档?

转载 作者:行者123 更新时间:2023-12-03 10:39:26 25 4
gpt4 key购买 nike

我在 Mongoose 中定义了以下架构:

var postSchema = mongoose.Schema({
title: String,
body: String,
created: Date,
photos: Array
});

var Post = mongoose.model('Post', postSchema);

var photoSchema = mongoose.Schema({
filename: String,
mimetype: String,
data: Buffer,
created: Date
});

var Photo = mongoose.model('Photo', photoSchema);

如果我删除帖子,我希望所有相关的照片也被删除(就像 SQL 中的级联删除)。

如果我执行 Post.remove({ _id: MY_POST_ID }),则只有 Post 被删除,而我只剩下孤立的 Photo在数据库中。

另外,我应该以某种方式在 Photo 架构中定义帖子 ID 吗?

最佳答案

获得真正原子操作的唯一方法是实际使用嵌入式模型,如下所示:

var photoSchema = mongoose.Schema({
filename: String,
mimetype: String,
data: Buffer,
created: Date
});

var postSchema = mongoose.Schema({
title: String,
body: String,
created: Date,
photos: [photoSchema]
});

var Post = mongoose.model('Post', postSchema);

然后,您实际上可以用一个简单的语句删除所有内容,因为它们都在同一个集合中,而且实际上是同一个文档中:

Post.remove({ "_id": postId },function(err) {
// handling in here
});

根据您当前的架构,您需要单独删除所有文档:

var async = require("async");

var photoSchema = mongoose.Schema({
filename: String,
mimetype: String,
data: Buffer,
created: Date
});

var Photo = mongoose.model('Photo', photoSchema);

var postSchema = mongoose.Schema({
title: String,
body: String,
created: Date,
photos: [{ "type": Schema.types.ObjectId, "ref": "Photo" }]
});

var Post = mongoose.model('Post', postSchema);

// later

async.waterfall(
[
function(callback) {
Post.findById(postId,callback);
},

function(post,callback) {
Photo.remove({ "_id": { "$in": post.photos } },function(err) {
if (err) callback(err);
callback();
});
},

function(callback) {
Post.remove(photoId,callback);
}
],
function(err) {
if (err); // do something
// Job done
}
)

如果您想避免先阅读文档,那么您

var photoSchema = mongoose.Schema({
postId: Schema.types.ObjectId,
filename: String,
mimetype: String,
data: Buffer,
created: Date
});

然后要删除与“帖子”相关的所有“照片”,然后发出:

Photo.remove({ "postId": postId },function(err) {
// removed or err
});

一般来说,如果您总是希望这种行为,并且您的“发布”文档在包含所有嵌入的“照片”信息时不能超过 16MB,那么嵌入选项最有意义,因为您不需要“照片”实际上除了作为单亲的 child 之外,可以在任何其他地方使用。

关于javascript - 如何删除MongoDB中的文档和所有嵌入文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28849237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com