如何让猫鼬将一组 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);
      
    
  );

现在我的代码正确保存了我的网址数组,每个网址都是imageUrlsSubdocument下的单独字符串。

【讨论】:

以上是关于如何让猫鼬将一组 url 推送到数组子文档的主要内容,如果未能解决你的问题,请参考以下文章

如何通过一次调用将一组对象推送到猫鼬中的数组中?

如何避免在对象内部创建对象并使用猫鼬将元素直接推送到快速数组中?

如何使用猫鼬将嵌入文档默认为空

使用猫鼬将对象数组添加到子文档

将文档推送到猫鼬模型数组中的子文档中

猫鼬子文档数组更新[重复]