基本上我正在开发一个聊天应用程序,这个mongoose架构代表了一个用于2个用户之间私人聊天的Schema。
我想要做的是检查客户端是否提供了id1和id2
在我的私人聊天db的集合。问题是这个mongoDB查询无法正常工作,如果这些用户ID已存在于聊天文档中。在user1和user2中使用相同的_id创建一个新的聊天文档。这就是为什么我需要$or
运算符,但我的查询不能正常工作
const chatSchema = new Schema({
user1: {
_id: String,
username: String,
fullName: String
},
user2: {
_id: String,
username: String,
fullName: String
},
messages: [
{
_id: false,
author: String,
text: String,
date: Number
}
]
});
所以这是我的实现来检查2个用户之间的这种关系是否已经存在。如果存在则执行某些操作,如果它不创建文档并保存它。 data.user._id
表示用户的ID,data.friend._id
表示您要与之聊天的用户的ID。
Chat.count(
{
$or: [
{
user1: {
_id: data.user._id
},
user2: {
_id: data.friend._id
}
},
{
user2: {
_id: data.user._id
},
user1: {
_id: data.friend._id
}
}
]
}, (err, count) => {
if (!count) {
new Chat({
user1: data.user,
user2: data.friend,
messages: []
}).save((err, data) => {
if (err) {
console.log(err);
}
socket.join(data._id);
socket.emit('chats', data);
});
}
});
答案 0 :(得分:2)
您需要使用MongoDB dot notation在$或运算符中进行查询。
在$或
中尝试此操作 {
$or: [
{
"user1._id": data.user._id,
"user2._id": data.friend._id
},
{
"user2._id": data.user._id,
"user1._id": data.friend._id
}
]
}
根据文档: -
要使用点表示法指定或访问嵌入文档的字段,请将嵌入的文档名称与点(。)和字段名称连接起来,并用引号括起来: