I am building a chat app using mongoose and nestjs. This is my first attempt of using mongo as database so I am having trouble differentiate which mongo query should I be using.
The following function is to find one on one chat between logged in user and other user. I tested the two approach in Insomnia and they come back the same result.
Approach 1
async findOneOnOneChat(currentUserId, userId) {
const oneOnOneChat = await this.chatModel
.find({
isGroupChat: false,
})
.and([
{ users: { $elemMatch: { $eq: currentUserId } } },
{ users: { $elemMatch: { $eq: userId } } }
])
return oneOnOneChat;
}
Approach 2
async findOneOnOneChat(currentUserId, userId) {
const oneOnOneChat = await this.chatModel
.find({
isGroupChat: false,
})
.and([{ users: { $in: userId } }, { users: { $in: id } }])
return oneOnOneChat;
}
So my question is what is the difference between two approach? Which approach is better? Or is there a better version can achieve what I want?
CodePudding user response:
These are to different things.
Use{users: { $in: userId } } when userId is an array, and you want user value(s) to match one or more of the elements in userId. In this case user can be a single value or array of values, but userId must be an array. You can think of it as a loop on userId, that for each element in userId searching for a match in user.
Use { users: { $elemMatch: { $eq: userId } } } where users is an array and userId is a single value. You can think of it as a loop on users, that for each element in users searching for a match that equals userId.
