引用数组中的重复条目 - MongoDB - Mongoose

时间:2017-06-15 08:27:13

标签: node.js mongodb mongoose

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

这些是我的模特:

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在separeted文件中,然后作为模型导出)

这是我保存帖子的代码:

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到ObjectId失败

1 个答案:

答案 0 :(得分:0)

不要忘记hanlde错误

编辑你的代码:( 使用Mongoose + nodejs - 我建议使用indexOf,它与我运行良好,我的DB有大约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
                    }
               }
           });
        });
      }
   });

OR

如果您使用MongoDb或Mongoose

,请使用$ addToSet

希望它会对你有所帮助。

谢谢