У меня есть коллекция болтает с участниками поддокументом как так ..эквивалента группы захвата для согласованного поддокументе
{
_id: '1',
participants: [ { _id: 'A', seen: false }, { _id: 'B', seen: false } ],
messages: []
}
Есть только 2 участников и один из них являются CurrentUser. Я не знаю, что. Кроме того, существует только один чат для любой пары пользователей.
Для того, чтобы найти чат, я использую оба идентификатора пользователя. Таким образом, находка запрос выглядит следующим образом:
Chats.find(
{ $and: [
{ participants: {$elemMatch: {_id: otherUserId}}},
{ participants: {$elemMatch: {_id: currentUserId}}}
]}
)
Я хотел бы, чтобы позволить CurrentUser обновить свое seen
поле в одной операции обновления.
В настоящее время я должен сначала найти чат, определить, какой индекс этих двух пользователей является currentUser, а затем создать документ для обновления этого пользователя и обновить его в отдельной операции.
Есть ли что-то похожее на группу захвата регулярных выражений, поэтому я могу узнать идентификатор элемента, который соответствует currentUserId? Возможно, это так .....
Chats.update( { $and: [
{ participants: {$elemMatch: {_id: otherUserId}}},
{ participants: capture({$elemMatch: {_id: currentUserId}})}
]},
{
$set: {"participants.(capture[0]).seen": true}
})
Или есть лучший способ?
Это замечательно - немного странно, но оно работает! Я написал тесты, и они передаются в обоих случаях: ли currentUser хранится в 0 или 1. –
Это интересный подход и работает без '$ elemMatch'. У вас есть ссылка на документы о том, как оператор '$ and' влияет на« $ -проекцию »? – JeremyK
жаль, что нет. Это был след и ошибка. Хотелось бы, чтобы у меня было что-то, что можно было поддержать, и это было причиной того, что я не хотел, чтобы это было ответом. – Veeram