我有以下模型:
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
else 更新
投票。
我已经能够编写以下代码行:
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 有处理这类更新的 native 方法,但是您当然需要按原样测试匹配。
我们在这里可以做的只是在文档存在的true
或false
条件下工作。
考虑 vote.value
是你的 true
或 false
的“upvote”
如果您发现有匹配文档,您可以像这样发布更新:
Question.update(
{
_id: questionId,
"votes.createdBy" vote.createdBy,
"votes.up": {"$ne": vote.value }
},
{ $set: { "votes.$.up": vote.value } }
);
因此匹配并使用 positional $
运算符以确保更新匹配项的正确 index。我在此处添加的内容可确保您甚至不会触摸 vote.vaule
已具有相同值的文档。
在错误的情况下你想要$push使用新的项放到数组上:
Question.update(
{
_id: questionId
},
{
$push: {
"votes": {
"up": vote.value,
"createdBy": vote.createdBy
}
}
}
);
当然,在应用 writeConcern
的地方添加回调细节,您可能会这样做。
关于node.js - Mongoose 更新子文档(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039985/