如何用Mongoose查询包含指定两个用户ID的Conversation文档
问题:如何检查是否存在同时包含两个用户ID的对话?
当前定义的Conversation Schema:
const { Schema, model } = require("mongoose"); const ConversationSchema = Schema( { members: { type: Array, }, }, { timestamps: true } ); module.exports = model("Conversation", ConversationSchema);
现有代码问题:
当前使用$in查询的方式无法实现需求,因为$in会匹配数组中至少包含一个指定ID的文档,而非同时包含senderId和receiverId两个ID的对话。
正确解决方案:
需要使用$all操作符,它会匹配数组中包含所有指定元素的文档。同时推荐用findOne替代find,因为只需确认是否存在单个符合条件的对话,查询效率更高。
方案1:仅检查同时包含两个ID(允许对话有更多成员)
const newConversation = async (req, res = response) => { try { const { senderId, receiverId } = req.body; // 用$all匹配同时包含两个ID的对话 const conversation = await Conversation.findOne({ members: { $all: [senderId, receiverId] } }); if (!conversation) { const dbConversation = new Conversation({ members: [senderId, receiverId], }); await dbConversation.save(); return res.status(201).json({ ok: true, conversation: dbConversation }); } else { return res.status(403).json({ ok: false, msg: "Conversation already exist", }); } } catch (err) { return res.status(500).json({ ok: false, msg: "Please contact with administrator", }); } };
方案2:严格检查仅包含这两个ID(对话成员数量为2)
如果要求对话只能是这两个用户之间的一对一对话,不能有其他成员,可以结合$size限制数组长度:
const conversation = await Conversation.findOne({ members: { $all: [senderId, receiverId], $size: 2 // 确保数组只有两个元素 } });
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

