简体   繁体   English

Mongoose 过滤器使用或条件

[英]Mongoose filter using or condition

I am creating a chat application using nodejs and mongodb.我正在使用 nodejs 和 mongodb 创建一个聊天应用程序。 I need need help retrieving messages between two users.我需要帮助来检索两个用户之间的消息。 The challenge am facing is I don't know how to filter the chats between two users since a user can be a sender or a recipient.我面临的挑战是我不知道如何过滤两个用户之间的聊天,因为用户可以是发件人或收件人。

const messageSchema = new mongoose.Schema({
    content:{type:String, required:true},
    fromUser:{type:mongoose.Schema.Types.ObjectId, ref:'User'},
    toUser:{type:mongoose.Schema.Types.ObjectId, ref:'User'},
    messageRead:{type:Boolean, default:false}
},{
    timestamps:true
})

You can achieve this using $and and $in operators in a match aggregation like this:您可以在匹配聚合中使用$and$in运算符来实现这一点,如下所示:

db.collection.aggregate([
  {
    $match: {
      $and: [
        {
          fromUser: {
            $in: [
              "user1",
              "user2"
            ]
          }
        },
        {
          toUser: {
            $in: [
              "user1",
              "user2"
            ]
          }
        }
      ]
    }
  }
])

In mongoose if your model is MessageModel your query must be like this:在 mongoose 如果您的 model 是 MessageModel 您的查询必须是这样的:

const messages = await MessageModel.aggregate([...])

Mongodb Playground Mongodb游乐场

I recommend getting the data exactly as you want it:我建议完全按照您的需要获取数据:

const userA = new ObjectId('user_a_id');
const userB = new ObjectId('user_b_id');
const messages = await MessageModel.find({
  $or: [
    { fromUser: userA, toUser: userB },
    { fromUser: userB, toUser: userA },
  ]
}).exec();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM