我有一个与参与者的聊天集合,例如So ..
{
_id: '1',
participants: [ { _id: 'A', seen: false }, { _id: 'B', seen: false } ],
messages: []
}
只有2个参与者,其中一个是当前使用者。我不知道哪个。此外,任何对用户都只有一次聊天。
为了找到聊天,我使用两个用户ID。因此,查询查询看起来像这样:
Chats.find(
{ $and: [
{ participants: {$elemMatch: {_id: otherUserId}}},
{ participants: {$elemMatch: {_id: currentUserId}}}
]}
)
我想允许当前使用者在一个更新操作中更新自己的seen
字段。
目前,我必须首先找到聊天,确定两个用户的索引是当前使用者,然后构建一个文档以更新该用户并在单独的操作中更新。
是否有类似于Regex捕获组的东西,以便我知道与CurrentUserid匹配的元素的ID?可能是这样的.....
Chats.update( { $and: [
{ participants: {$elemMatch: {_id: otherUserId}}},
{ participants: capture({$elemMatch: {_id: currentUserId}})}
]},
{
$set: {"participants.(capture[0]).seen": true}
})
还是有更好的方法?
好吧,这可能不是您要寻找的解决方案,但我认为我应该建议它有所帮助。
Chats.update( { $and: [
{ participants: {$elemMatch: {_id: otherUserId}}},
{ participants: {$elemMatch: {_id: currentUserId}}}
]},
{
$set: {"participants.$.seen": true}
})
这将适用于您,因为$ Elemmatch存储了匹配数组的索引。作为您的$ lematch,它将存储与最后一个$ Elematch匹配的索引,在您的情况下将是当前用户。因此,当您使用位置操作器时,它将更新当前用户的可见字段。
轻松更新'可见'状态的一种简单方法是构造这样的数据:
{
_id: '1',
participants: [ 'A', 'B'],
seen: [],
messages: []
}
然后,您可以更新" A"已经看到这样的消息:
Chats.update(
{ $and: [ {participants: 'A'}, {participants: 'B'} ] },
{ $addToSet: { seen: 'A' } }
)
- 如果您只有一个查询,则不需要
- $ lemmatch里面的条件
- $ addtoset只会添加'a',如果没有已经存在。