相当于匹配的子记录的捕获组



我有一个与参与者的聊天集合,例如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',如果没有已经存在。

最新更新