如何让猫鼬将一组 url 推送到数组子文档
Posted
技术标签:
【中文标题】如何让猫鼬将一组 url 推送到数组子文档【英文标题】:How can I get mongoose to push an array of urls to an array subdocument 【发布时间】:2020-03-17 13:57:22 【问题描述】:我正在制作一个包含多个上传图片和多个帖子的博客系统。 我创建了一个上传屏幕,允许我选择一些以前的图像,然后将其发布到后端。 这一切都正常工作(感谢我在堆栈溢出时收到的一些帮助),并且控制台从服务器获取此记录:
[ 'http://res.cloudinary.com/jacobsiler-com/image/upload/v1574344215/SilerGuitars/f8q5d4kedss1tpmhxmwg.jpg',
'http://res.cloudinary.com/jacobsiler-com/image/upload/v1574344227/SilerGuitars/fveajqk0ehwy5mxywysa.jpg',
'http://res.cloudinary.com/jacobsiler-com/image/upload/v1574344201/SilerGuitars/lfxwkq8xhhkyxn85oyna.jpg' ]
这些是上传到 Cloudinary 并保存在 mongoDB 文档中的图像的图像 url。 现在我尝试使用 findOneAndUpdate 将此输出保存到选定的帖子文档:
app.post("/post-images", (req, res) =>
//const post=req
var postImages = req.body;
const postID = postImages.shift();
console.log(postImages);
Post.findByIdAndUpdate(
_id: postID ,
$push: imageUrls: $each: [ postImages ] ,
lean: true, new: true ,
function(err, foundPost)
if (!err)
console.log(foundPost);
res.redirect("/");
else
console.log("error: " + err);
);
//res.redirect("/");
);
我预先添加了我希望将图像添加到 postImages 数组的帖子 ID,然后将其分隔到我的 postID const 中并记录字符串数组。这是我选择的ID。然后我尝试将字符串数组的字符串推送到文档中。 我可以看到它可能只以文档中的一个字符串结尾,我不确定如何正确处理。我需要以某种方式分隔保存的网址。
这是我在 Robo 3T 中的帖子数据库:
Post DB on Robo 3T
我想要的结果是突出显示的对象是数组中的一个 url,所有其他类似的对象都是一个通向图像的 url。
我尝试过使用不同的更新函数(updateOne、findByIdAndUpdate、findOneAndUpdate 等),并将不同的选项传递给它们。看来我已经尝试了这一行中所有可能的组合: $push: imageUrls: $each: [ postImages ]
一切都无济于事。这是我的架构和模型:
//Defining the Image Schema
const imageSchema =
url: String,
id: String
;
const Image = new mongoose.model("Image", imageSchema);
//Defining the Post Schema
const postSchema =
title: String,
content: String,
imageUrls: [ url: String ]
;
const Post = new mongoose.model("Post", postSchema);
我不确定我错过了什么。 非常感谢所有帮助和建议使其正常工作。
【问题讨论】:
【参考方案1】:通过试验、错误和对 mongoose 文档的搜索,我最终找到了我正在寻找的答案。如果您有同样的问题,希望答案对您有所帮助。
首先,我需要更改我定义架构的方式,因为它并不是一个对象数组,而只是一个数组:
//Defining the Post Schema
const postSchema =
title: String,
content: String,
imageUrls: [ String ]
;
以前的 url 和 id 字段对我来说是不必要的,所以我也删除了它们。
然后我查看了足够多的 mongoose 文档,偶然发现了 $addToSet
并阅读了它的作用。这似乎是答案,事实证明确实如此。要将我的图片网址保存到文档中,我最终得到了以下代码:
app.post("/post-images", (req, res) =>
//const post=req
var postImages = req.body;
const postID = postImages.shift();
console.log(postImages);
Post.updateOne(
_id: postID ,
$addToSet: imageUrls: $each: postImages
,
function(err, foundPost)
if (!err)
console.log(foundPost);
res.redirect("/");
else
console.log("error: " + err);
);
现在我的代码正确保存了我的网址数组,每个网址都是imageUrls
Subdocument下的单独字符串。
【讨论】:
以上是关于如何让猫鼬将一组 url 推送到数组子文档的主要内容,如果未能解决你的问题,请参考以下文章