Mungo update sub-Dokument, falls vorhanden
Habe ich folgende Modell :
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);
Angenommen user1
ist der Benutzer eingeloggt ist, und question1
aktuell /anzeigen Frage.Der Benutzer kann upvote
({up:true}) oder downvote
({up:false}) jederzeit eine Frage. Wie kann ich add
eine neue vote
wenn ein user1
haben nicht gegossen eine Stimme für question1
sonst update
Abstimmung.
Ich in der Lage gewesen zu schreiben, die folgenden Zeilen des Codes:
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);
}
});
});
- Ich nehme an, Sie versuchen zu tun 'upsert'.check this out. docs.mongodb.org/manual/reference/method/db.collection.update
- Dies ist nicht eine
upsert
Sie schiebt ein Element auf den array, wenn es nicht vorhanden ist oder Aktualisierung in einem Ort, wo es spielt. Das array eingebettet ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, Sie sind Teil der Art und Weise, aber wenn Sie nicht finden, eine
doc
dann werden Sie nicht haben einedoc
arbeiten mit in den callback. MongoDB hat native Wege im Umgang mit diesen Arten von updates, aber natürlich müssen Sie für den test match, wie Sie sind.Was wir hier tun können, ist nur die Arbeit innerhalb der
true
oderfalse
Zustand, in dem das Dokument besteht.Angesichts
vote.value
Ihretrue
oderfalse
für die "upvote"Wo Sie finden, dass es ein passendes Dokument, das Sie ausstellen können ein update wie dieses:
So, dass Streichhölzer und verwendet eine positions -
$
Betreiber sicherstellen, dass die richtigen index des übereinstimmenden Elements aktualisiert. Was ich fügte hinzu, es sorgt dafür, dass Sie nicht einmal berühren Sie das Dokument, in dem dervote.vaule
ist bereits der gleiche Wert.Und in der falschen Bedingung, die Sie wollen $push auf das array mit den neue item:
Natürlich hinzufügen die callback-details, wo
writeConcern
angewendet wird, die Sie vermutlich nicht.positional - $
nach$setting
. Ich habe diese Informationen in cb[ 1, { updatedExisting: true, n: 1, connectionId: 93, err: null, ok: 1 } ]
.