Om een document in te voegen als het niet bestaat, wordt gedaan door upsert en als u een voorwaardelijk ingesloten document wilt bijwerken, hebt u $ positionele operator nodig. U moet dus beide in de query gebruiken om bovenstaande functionaliteit te implementeren.
Maar op dit moment ondersteunt mongodb geen upserting met $ positionele operator
Dus wat je wilt is voorlopig niet mogelijk in één zoekopdracht, je kunt het ook in twee zoekopdrachten doen.
Eerst
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Het geeft het aantal bijgewerkte documenten terug, als het 1 is, is het goed, en als het 0 is, moet je een nieuw record pushen.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Er is ook een jira-ticket voor positionele operator en upserting, stem voor dit probleem als je deze functionaliteit in mongodb wilt. Hieronder is de link van het probleem
https://jira.mongodb.org/browse/SERVER-3326
(BEWERKEN :Het Jira-ticket is gesloten met Do not Do in juni 2019)