繁体   English   中英

Mongoose更新子文档(如果存在)

[英]Mongoose update sub document if exists

我有以下型号:

var VoteSchema = new Schema({
    up : Boolean
    , createdBy:{type:ObjectId, ref:'users'}
    , createdOn : {type:Date, default:Date.now}
});

var QuestionSchema = newSchema({
    title:String
    , description:String
    , votes : [VoteSchema]
    , createdBy:{type:ObjectId, ref:'users'}
    , createdOn : {type:Date, default:Date.now}
});

var Question = mongoose.model('questions',QuestionSchema);

假设user1已登录用户,而question1是当前/查看问题。用户可以随时upvote ({up:true})或downvote ({up:false})一个问题。 如果user1没有为question1 vote则如何add新投票,否则update投票。

我已经能够编写以下代码行:

QuestionSchema.statics.castVote = function(questionId, vote) {
    //NOTE : vote.createdBy equalsto loggedInUserID

    Q.nbind(Question.findOne, Question)({
        $and:[
            {_id:questionId},
            {'votes.createdBy':vote.createdBy}
        ]
    }).then(function(doc) {

        if(doc) {
           //I am clue less
           //doc.votes is a list of votes for this question
           // how can I get the particular vote casted by the user - vote.createdBy
        }else {
           //Question.votes.push(vote);
        }
    });

});

所以你是那里的一部分,但是当你没有找到一个doc那么你将无法在回调中使用doc MongoDB具有处理这些类型更新的本机方式,但当然您需要按原样测试匹配

我们在这里可以做的只是在文档存在的truefalse条件下工作。

考虑到vote.value是你的“upvote”的truefalse

如果您发现有匹配的文档,您可以发出如下更新:

Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);

这样匹配并使用位置 $运算符来确保更新匹配项的正确索引 我在那里添加的内容确保您甚至不会触及vote.vaule已经具有相同值的文档。

在错误的情况下,你想用项目送到数组:

Question.update(
  { 
    _id: questionId
  },
  { 
    $push: { 
      "votes": {
        "up": vote.value,
        "createdBy": vote.createdBy
      }
    }
  }
);

当然,添加应用writeConcern的回调详细信息,您可能会这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM