[英]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具有处理这些类型更新的本机方式,但当然您需要按原样测试匹配 。
我们在这里可以做的只是在文档存在的true
或false
条件下工作。
考虑到vote.value
是你的“upvote”的true
或false
如果您发现有匹配的文档,您可以发出如下更新:
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.