喜欢/不喜欢mongodb使用批量

时间:2017-09-06 12:18:38

标签: mongodb mongoose

let bulk = Card.collection.initializeOrderedBulkOp();
// if user doesn't exist in array
bulk.find({
    '_id': mongoose.Types.ObjectId(card_id),
    'likedBy': { '$ne': mongoose.Types.ObjectId(user_id) }
}).updateOne({
    '$inc': { 'likes': 1 },
    '$push': { 'likedBy': mongoose.Types.ObjectId(user_id) }
});
// if user exists in array
bulk.find({
    "_id": mongoose.Types.ObjectId(card_id),
    "likedBy": mongoose.Types.ObjectId(user_id)
}).updateOne({
    "$inc": { "likes": -1 },
    "$pull": { "likedBy": mongoose.Types.ObjectId(user_id) }
});

bulk.execute(function(response) {
    console.log(response);

    return res.json({
        'state': true,
        'msg': 'Successful',
    })
});

如果likes数组中存在用户ID,则应通过递增或递减likedBy字段来执行上述操作。

但是,两个函数都会运行,因此最后一个批量操作将成为最后一个操作。在上面,最终结果总是为零。

我怀疑查询始终与文档匹配,因此.updateOne()部分在所有部分上运行。

这是架构:

var CardSchema = new Schema({
  slug: {
    type: String,
    lowercase: true,
    index: true
  },
  title: String,
  content: String,
  createdAt: {
    type: Date,
    default: Date.now,
  },
  updatedAt: {
    type: Date,
  },
  options: [],
  likedBy: [],
  likes: Number,
  createdBy: String,
  featured: Boolean,
});

有没有更好的mongo方式来做类似/不喜欢的事情?

1 个答案:

答案 0 :(得分:0)

现在就这样做。太冗长,但有效。我在UI中分别创建了一个likedislike按钮,它调用了两个独立的函数,但调用了相同的端点,端点被装配如下:

let like = req.body.like;
// if request is a like
if (like) {
    Card.update({
        '_id': mongoose.Types.ObjectId(card_id),
        'likedBy': { '$ne': mongoose.Types.ObjectId(user_id) }
    }, {
        '$inc': { 'likes': 1 },
        '$push': { 'likedBy': mongoose.Types.ObjectId(user_id) }
    }, function(err) {
        if (err) {
          console.log(err);
           return res.json({
            'state': false,
            'msg': err
           })
        }

        return res.json({
            'state': true,
            'msg': 'Liked',
        })
    })
} else if (!like) { // if request is dislike
    Card.update({
        '_id': mongoose.Types.ObjectId(card_id),
        'likedBy': mongoose.Types.ObjectId(user_id) 
    }, {
        '$inc': { 'likes': -1 },
        '$pull': { 'likedBy': mongoose.Types.ObjectId(user_id) }
    }, function(err,) {
        if (err) {
           console.log(err);
           return res.json({
            'state': false,
            'msg': err
           })
        }

        return res.json({
            'state': true,
            'msg': 'Disliked',
        })
    })
}

然后这样的事情发出请求,

likeCard(card_id: string, like: boolean) {
let param = {
  card_id: card_id,
  like: like
};

return this.http.post(AppSettings.API_ENDPOINT + '/card/like', JSON.stringify(param), { headers: this.headers })
  .map((res) => {
    return res
  })
}