【问题标题】:Duplicated entries in referenced array - MongoDB - Mongoose引用数组中的重复条目 - MongoDB - Mongoose
【发布时间】:2017-11-17 15:36:04
【问题描述】:

我是 MongoDb 的新手,几天前我遇到了这个问题,我无法解决它。基本上,我的用户可以使用一堆图像创建新帖子。当我创建帖子时,我也创建了图像,但是当我在 mongo shell 上检查帖子数组中的条目时,一个图像可以出现两到三次。 (所有图片都用url保存)

这些是我的模型:

var postSchema = new mongoose.Schema({
   Name: String,
   Background: String,
   Description: String,
   posted: {type:Date,default: Date.now() },
   images: [{type: mongoose.Schema.Types.ObjectId, ref: "image"}]
});

var imageSchema = new mongoose.Schema({
    src: String,
    caption: String
});

(这些 Schema 在单独的文件中,然后作为模型导出)

这是我保存帖子的代码:

app.post("/post",isLoggedIn,function(req,res){

   var post= {Name: req.body.name, 
              Background: req.body.backg,
              Description: req.body.desc};

   Posts.create(post, function(err, newPost){
      if(err){
         console.log(err);
      } else {
            var allImages = req.body.img;
            allImages.forEach(function(singleImg){
            Images.create(singleImg, function(err, newImg){
                if(err){
                    console.log(err);
                } else {
                   newPost.images.push(newImg);
                   newPost.save(function(err){
                     if(err){
                       return res.send(err);
                    }
                 });
               }
           });
        });
      }
   });
   return res.redirect("/posts");
});

编辑 这是我的代码 $addToSet

app.post("/post",isLoggedIn,function(req,res){

       var post= {Name: req.body.name, 
                  Background: req.body.backg,
                  Description: req.body.desc};

       Posts.create(post, function(err, newPost){
          if(err){
             console.log(err);
          } else {
             Posts.findByIdAndUpdate(newPost._id, {$addToSet:{images: {$each: req.body.img}}}, function(err, updatedPost){
                 return res.redirect("/posts");
            });
          }
       });
    });

它给了我 CastError Cast to ObjectId failed

【问题讨论】:

  • 如果使用$pushmodel.push() 操作,实际上没有什么可以阻止这种情况的发生。如果您需要保持它们的唯一性,请确保使用$addToSet
  • 我会尝试使用 $addToSet
  • 在问题中显示您的代码。
  • 是的,现在我编辑

标签: node.js mongodb mongoose


【解决方案1】:

不要忘记处理错误

编辑您的代码:(使用 Mongoose + nodejs - 我建议使用 indexOf,它运行得很好,我的数据库有大约 10M 条记录

来自

Posts.create(post, function(err, newPost){
      if(err){
         console.log(err);
      } else {
            var allImages = req.body.img;
            allImages.forEach(function(singleImg){
            Images.create(singleImg, function(err, newImg){
                if(err){
                    console.log(err);
                } else {
                   newPost.images.push(newImg);
                   newPost.save(function(err){
                     if(err){
                       return res.send(err);
                    }
                 });
               }
           });
        });
      }
   });

Posts.create(post, function(err, newPost){
      if(err){
         console.log(err);
      } else {
            var allImages = req.body.img;
            allImages.forEach(function(singleImg){
            Images.create(singleImg, function(err, newImg){
                if(err){
                    console.log(err);
                } else {
                    // Check exist
                    if (newPost.images.indexOf(newImg._id) == -1) {
                        newPost.images.push(newImg._id);
                        newPost.save(function(err){
                            if(err) {
                               return res.send(err);
                            }
                        });
                    } else {
                        console.log(newImg);
                        // do something
                    }
               }
           });
        });
      }
   });

如果您使用 MongoDb 或 Mongoose,请使用 $addToSet

希望对你有所帮助。

谢谢

【讨论】:

  • 我尝试了您的第一个解决方案,但它不断重复图像
  • 可以吗?我的朋友@Marsquale
  • 如果你修好了就发送消息 :) 这段代码对我来说运行得很好
  • 你确定吗?我要疯了哈哈哈。您是否使用了与此处粘贴的完全相同的代码?还是谢谢你!
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 2020-09-29
  • 1970-01-01
  • 2014-04-16
  • 2018-01-19
相关资源
最近更新 更多