Node.js Mongoose更新子文档(如果存在)
我有以下型号:Node.js Mongoose更新子文档(如果存在),node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有以下型号: 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 : [VoteSch
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})随时对问题进行投票如果用户1
尚未对问题1
进行投票,我如何添加新的投票。
我已经能够编写以下代码行:
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
作为“向上投票”的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
的位置添加回调详细信息,您可能会这样做。我想您正在尝试执行“upsert”。请检查此项@suish这不是一个upsert
,它是将一个不存在的项推送到数组中,或者在它存在的地方进行更新。该阵列是嵌入式的。非常好,这也许是解决这类问题的唯一方法。是否可以在$设置
之后获取位置-$
的值。我在cb[1,{updatedeexisting:true,n:1,connectionId:93,err:null,ok:1}]
@Lekhnath-Um中得到了这个信息,我不太确定。你看到的是受影响的部分。回调中的第三个参数应该是rawResponse(不管是什么),因此您可以查看它,看看是否有什么有趣的内容。