gpt4 book ai didi

node.js - Mongoose 聚合 - 有条件查找(user1 或 user2)

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:37 26 4
gpt4 key购买 nike

我正在编写一个数据库聚合函数,以便从 Messages 表中获取用户的 ChatHeads

以下是来自 Messages 表的消息对象

{
"_id": "5c6e54c194509100146ea6da",
"chat_id": "5bc81391767ba50013bc251c5bc58ac0ff45070013383422",
"user1": "5bc58ac0ff45070013383422",
"user2": "5bc81391767ba50013bc251c",
"messageFrom": "5bc58ac0ff45070013383422",
"dateTime": "2019-02-21T07:35:29.653Z",
"message": "Hello ",
}

根据发出请求的用户,聊天头应填充其他用户的 ID,以在聊天头中显示他的姓名/图片。

我正在使用聚合来获取聊天头,但其他用户的条件填充是我遇到的麻烦。以下是我当前的查询,其中 req.user._id 是请求用户的 ID。

chat.aggregate(

{
$match: {
$or: [ { user1:req.user._id }, { user2:req.user._id } ]
}
},
{
$group:{
_id: '$chat_id',
entry: { $first: "$$ROOT" },

}
}

根据我的理解,带有条件的 $lookup 可能会有所帮助,其中 localField 应根据其值更改为 entry.user1entry.user2

以下为汇总部分

$lookup: {
from: "users",
localField: < "entry.user1" or "entry.user2" depending upon condition> ,
foreignField: "_id",
as: "other_user"
}

我的要求

如果 entry.user1==req.user._id

localField 应该显示 entry.user1如果 entry.user2==req.user._id

localField 应该显示 entry.user2

最佳答案

我认为这个描述有点含糊,但我明白你的观点,并且只有两种可能性。假设您想显示其他用户的个人资料,您可以使用以下聚合:

db.messages.aggregate([
{ $match: { $or: [ { user1:req.user._id }, { user2:req.user._id } ] } },
{ $addFields: { otherUser: { $cond: [ { $eq: [ "$user1", req.user._id ] }, "$user2", "user1" ] } } },
{ $lookup: { from: "users", localField: "otherUser", foreignField: "_id", as: "otherUserDetails" } }
])

基本上在运行 $lookup 之前您可以使用$addFields$cond定义应使用哪个用户的 id 进行查找。

关于node.js - Mongoose 聚合 - 有条件查找(user1 或 user2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com