mongoose $elemMatch和$in的区别

brgchamk  于 2023-03-30  发布在  Go
关注(0)|答案(1)|浏览(197)

我正在使用mongoose和nestjs构建一个聊天应用程序。这是我第一次尝试使用mongo作为数据库,所以我很难区分我应该使用哪个mongo查询。
下面的功能是找到登录用户和其他用户之间的一对一聊天。我在Insomnia中测试了这两种方法,结果是一样的。
方法1

async findOneOnOneChat(currentUserId, userId) {
  const oneOnOneChat = await this.chatModel
    .find({
      isGroupChat: false,
    })
    .and([
      { users: { $elemMatch: { $eq: currentUserId } } },
      { users: { $elemMatch: { $eq: userId } } }
    ])
  return oneOnOneChat;
}

方法二

async findOneOnOneChat(currentUserId, userId) {
  const oneOnOneChat = await this.chatModel
    .find({
      isGroupChat: false,
    })
    .and([{ users: { $in: userId } }, { users: { $in: id } }])
  return oneOnOneChat;
}

所以我的问题是两种方法有什么区别?哪种方法更好?或者有更好的版本可以实现我想要的?

zaq34kh6

zaq34kh61#

这是两码事。
userId是一个数组,并且需要user值时,使用{ users: { $in: userId } }(s)来匹配userId中的一个或多个元素。在这种情况下,user可以是单个值或值的数组,但userId必须是数组。您可以将其视为userId上的循环,对于userId中的每个元素,在user中搜索匹配项。
使用{ users: { $elemMatch: { $eq: userId } } },其中users是一个数组,userId是一个单一的值。你可以把它看作是users上的一个循环,对于users中的每个元素,都在搜索一个等于userId的匹配。

相关问题