Javascript Mongoose-$并且不能正常工作,需要找到包含这两个项的数组
我正在开发一个基于聊天的应用程序。两个人之间的私人消息是聊天模型,如下所示:Javascript Mongoose-$并且不能正常工作,需要找到包含这两个项的数组,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我正在开发一个基于聊天的应用程序。两个人之间的私人消息是聊天模型,如下所示: let schema = new Schema({ members: [{ type: ObjectId, ref: models.user.name }], chatHistory: [{ type: ObjectId, ref: models.message.name }] }) 对于聊天路线,我有它,所以当你向个人发送消息时,它应该在聊天中查找,如果req.params.id、你联系的人的id和req.
let schema = new Schema({
members: [{ type: ObjectId, ref: models.user.name }],
chatHistory: [{ type: ObjectId, ref: models.message.name }]
})
对于聊天路线,我有它,所以当你向个人发送消息时,它应该在聊天中查找,如果req.params.id、你联系的人的id和req.session.uid你的id都存在于成员数组中,则查找并返回聊天。不幸的是,它正在查找并返回具有req.params.id或req.session.uid的第一个聊天,因此Mongo中的$and实际上起着or的作用。以下是导致问题的路线:
createChat: {
path: '/profile/:id/chat',
reqType: 'post',
method(req, res, next) {
let action = 'Create new chat'
Chats.findOne({ $and: [{ members: { $in: [req.session.uid] }, members: { $in: [req.params.id] } }] }).populate('members chatHistory')
.then(chat => {
if (!chat) {
Chats.create({ members: req.session.uid })
.then(newChat => {
newChat.members.push(req.params.id);
newChat.save()
.then(chat => {
Chats.findById(chat._id).populate('members')
.then(chat => {
res.send(handleResponse(action, chat))
})
})
})
} else {
res.send(handleResponse(action, chat))
}
})
.catch(error => {
return next(handleResponse(action, null, error))
})
}
}
我知道造成问题的原因如下:
Chats.findOne({ $and: [{ members: { $in: [req.session.uid] }, members: { $in: [req.params.id] } }] }).populate('members chatHistory')
是否有人知道修复程序,以获得和,从而实际表现为或?成员密钥在$and中重复-这不是有效的对象。应该是,
//atleast on match
Chats.findOne({ $and: [{ members: { $in: [req.session.uid, req.params.id] } }] }).populate('members chatHistory')
或
我把它换了,但现在它每次只会回到同一个聊天室。基于此,我相信当你把它们放在一个数组中,比如{members:{$in:[req.session.uid,req.params.id]},它会返回一个匹配这些参数中的一个,而不是两个。这看起来很有效!我需要对它进行一点bug测试,但我认为这是可行的。谢谢!
//for both match
Chats.findOne({ $and: [{ members: { $in: [req.session.uid] }},{ members: { $in: [req.params.id] }}] }).populate('members chatHistory')