3

删除类似我的架构时遇到问题

/**
* Article Schema
 */
var Comments = new Schema({
    body: { type : String, default : '' },
    user: { type : Schema.ObjectId, ref : 'User' },
    createdAt: { type : Date, default : Date.now }
})
var Likes = new Schema({
    user: { type : Schema.ObjectId, ref : 'User' },
    createdAt: { type : Date, default : Date.now }
  })

var ArticleSchema = new Schema({
  title: {type : String, default : '', trim : true},
  body: {type : String, default : '', trim : true},
  geo: {type: [Number], set: setTags},
  user: {type : Schema.ObjectId, ref : 'User'},
  comments: [Comments],
  likes: [Likes],
  tags: {type: [], get: getTags, set: setTags},
  image: {type:String, default : ''},
  createdAt  : {type : Date, default : Date.now}
})

而且我想制作类似/不喜欢的功能,添加类似的作品但删除根本不会改变文档。控制器:

exports.like = function (req, res) {
var article = req.article
var user = req.user
Article.getArticleByWithLikesByUserId(req.user.id, function(err, articles) {
    console.log(articles);
    if(!articles.length){

      console.log('adding like',new Date);
      article.addLike(user, function (err) {
        if (err) return res.render('500')
        res.redirect('/articles/'+ article.id)
      });
    }
    else{
        console.log('removing like',new Date);
        article.removeLike(user, function (err) {
            if (err) return res.render('500')
            res.redirect('/articles/'+ article.id)
        });

    }

});

模式方法:

addLike: function (user, cb){

this.likes.push({
  user: user._id
})

this.save(cb);
},

removeLike: function (user, cb){
    var that = this;
    this.likes.forEach(function(like, index) { 
      if(like.user == user.id){
         var newLikesObj = that.likes.toObject(); 
         console.log("before splice:\n ",newLikesObj);
         newLikesObj.splice(index,1);
         console.log("after splice: \n",newLikesObj);
         that.likes = newLikesObj;
         that.save(cb)

      }
});

从日志拼接似乎工作正常

before splice:
  [ { user: 5247095b5696e45c2b000102,
    _id: 524defc87153550829000103,
    createdAt: Fri Oct 04 2013 01:29:28 GMT+0300 (Финляндия (лето)) },
  { user: 5247095b5696e45c2b000002,
    _id: 524df3c2a663050805000003,
    createdAt: Fri Oct 04 2013 01:46:26 GMT+0300 (Финляндия (лето)) } ]
after splice:
 [ { user: 5247095b5696e45c2b000102,
    _id: 524defc87153550829000103,
    createdAt: Fri Oct 04 2013 01:29:28 GMT+0300 (Финляндия (лето)) } ]

静态方法:

getArticleByWithLikesByUserId: function (id, cb) {
    this.find({ 'likes.user' : id })
      .populate('user', 'name email username')
      .populate('comments.user')
      .exec(cb)
  }

我也尝试过这种更新方法,即使 numberAffected 显示 1 仍然没有删除

this.update({$pull : {'likes.user':user.id}}, function(err, numberAffected){
    if(!err){
      return console.log('like removed');
    } else {
      return console.log(err);
    }
 });
4

1 回答 1

13

我不能说你的例子出了什么问题,除了你以错误的方式去做。MongoDB 提供了一种更简单的内置方法,可以通过精确指定或通过查询从数组中删除项目:

看看$pull运营商

在猫鼬中,一种方法是:

Article.findByIdAndUpdate(this._id, {
  $pull: {
    likes: {user: user._id}
  }
}, cb);
于 2013-10-03T23:31:10.070 回答