存在しない場合にドキュメントを挿入するには、upsertによって実行されます。条件付き埋め込みドキュメントを更新する場合は、$定位置演算子が必要です。したがって、上記の機能を実装するには、クエリで両方を使用する必要があります。
ただし、現時点では、mongodbは$位置演算子を使用したアップサーティングをサポートしていません
したがって、現時点では1つのクエリで実行することはできません。あるいは、2つのクエリで実行することもできます。
最初
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
更新されたドキュメントの数を返します。1の場合は問題ありません。0の場合は新しいレコードをプッシュする必要があります。
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
位置演算子とupsertingのjiraチケットもあります。mongodbでこの機能が必要な場合は、plzがこの問題に投票します。以下は問題のリンクです
https://jira.mongodb.org/browse/SERVER-3326
(編集 :jiraチケットは Wo n't Doでクローズされました 2019年6月)