Така че първото нещо, което трябва да се каже тук, е $elemMatch не е задължителен във вашия случай, тъй като искате да съпоставите само с един свойство на масива. Използвате този оператор, когато имате нужда от "две или повече" свойства от един и същ елемент на масива, за да отговарят на вашите условия. В противен случай просто използвате "точкова нотация" като стандарт.
Вторият случай тук е с $push , където този конкретен оператор означава "добавяне" на елементи към масива. Във вашия случай просто искате да „актуализирате“, така че правилният оператор тук е $set :
Activity.update(
{ "_id": activityId, "usersActivities.userId": Meteor.userId() },
{
"$set": {
'usersActivities.$.startDate': start,
'usersActivities.$.endDate': end
}
}
)
Така че позиционният $ операторът ето това, което съответства на "намерения индекс" от елемента на масива и позволява $set оператор, за да "промените" елементите, съответстващи на тази "позиция".