如何解决猫鼬在一个字段中处理两个ref ObjectID以获取ObjectId的每个集合
我在猫鼬和rest API方面还很新,我在检索每个集合时都遇到了问题,请参考另一个文档
所有这些模式都经过编辑以使其易于阅读,因为在实际情况下,我有更多字段认为不需要显示
我有一个user schema
数据,如下所示:
{
"_id": "123"
"username": "Paijo","email": "paijo@gmail.com"
}
{
"_id": "345"
"username": "Flix","email": "Flix@gmail.com"
}
我有message schema
这样的数据:
{
"_id": "5f525b2ac1267e868e882fbc","roomId": "123_345","latestMessage": "Bisa lahh cujkkkk","updatedAt": {
"$date": "2020-09-05T07:00:27.846Z"
},"createdAt": {
"$date": "2020-09-04T15:20:10.840Z"
}
}
我想查询user _id
中是否有roomId
,并检索user schema
和message schema
的所有字段。
因此,假设我使用user _id
123登录,我想获取roomId
中包含123的消息以及345
的详细用户,
我想要获取的预期结果是:
{
"_id": "5f525b2ac1267e868e882fbc","createdAt": {
"$date": "2020-09-04T15:20:10.840Z"
},"username": "Flix",// get result from user schema which has _id 345
"email": "Flix@gmail.com" // get result from user schema which has _id 345
}
目前,我只能通过此查询来获取包含_id
个用户登录名的所有消息,但我不知道如何在roomId
中获取另一个ID的详细用户
exports.listChat = async (req,res)=>{
const userID = req.userID
const listChat = await ChatRoom.find({roomId: new RegExp(userID)}).select("-message")
console.log('listChat',listChat)
res.send(listChat)
}
解决方法
您可以首先使用$split并定义两个单独的子字段:me
(当前用户)和other
-您想用于$lookup的值。
db.message.aggregate([
{
$addFields: {
members: {
$let: {
vars: { mem: { $split: [ "$roomId","_" ] } },in: {
me: { $arrayElemAt: [ { $filter: { input: "$$mem",cond: { $eq: [ "$$this","123" ] } } },0 ] },other: { $arrayElemAt: [ { $filter: { input: "$$mem",cond: { $ne: [ "$$this",}
}
}
}
},{
$match: {
"members.me": "123"
}
},{
$lookup: {
from: "user",localField: "members.other",foreignField: "_id",as: "user"
}
},{
$unwind: "$user"
},{
$project: {
_id: 1,roomId: 1,latestMessage: 1,updatedAt: 1,createdAt: 1,username: "$user.username",email: "$user.email",}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。