Använd $addToSet istället för $push .
db.push.update(
{ _id: 5 },
{ $addToSet: { "quizzes": {"wk": 6.0, "score": 8.0}, "play": {"wk": 6.0, "score": 8.0} } }
)
EDIT:
Det finns inget enkelt inbyggt tillvägagångssätt för villkorlig uppdatering av underdokument i ett matrisfält, efter specifik egenskap. Ett litet knep kan dock göra jobbet genom att utföra två kommandon i följd.
Till exempel:Om vi vill uppdatera quizzes fält med objektet { "wk": 7.0, "score": 8.0 } , vi kan göra det i två steg:
Steg-1: $pull ut underdokument från quizzes array där "wk": 7.0 . (Inget händer om matchande underdokument inte hittas ).
db.push.update(
{ _id: 5 },
{ $pull: { "quizzes": { "wk": 7.0 } } }
)
Steg-2: $addToSet underdokumentet.
db.push.update(
{ _id: 5 },
{ $addToSet: { "quizzes": {"wk": 7.0, "score": 8.0} } }
)
Du kan kombinera ovanstående två uppdateringskommandon med bulk.find().update()