首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MongooseJs中获取两个用户之间的会话列表

如何在MongooseJs中获取两个用户之间的会话列表
EN

Stack Overflow用户
提问于 2020-08-29 20:40:17
回答 2查看 204关注 0票数 1

我是MongoDB新手,正在尝试使用Node.Js和MongoDB构建一个简单的聊天应用程序。我被困在这里2天了,所以需要帮助!测试了堆栈溢出的大部分相关答案,但没有得到理想的结果。

我想要实现的是类似于我们在像Facebook Messenger和whatsApp网络这样的聊天应用程序中看到的东西,在其中一个方面,我们可以看到我们所有的对话列表,其中显示了最后的消息和个人资料。

A example here http://roba.laborasyon.com/demos/dark/ (左边栏)

这是我的模型的样子

代码语言:javascript
运行
复制
const chat = new Schema({
    to:{
        type:Schema.Types.ObjectId,
        ref:"User",
        required:true,
    },
    from:{
        type:Schema.Types.ObjectId,
        ref:"User",
        required:true,
    },
    seenbySender:Boolean,
    seenByReceiver:Boolean,
    isFile:{
        type:Boolean,
        default:false
    },
    file:{
        type:Object,
        required:false,
    },
    text:String,
},{timestamps:true});

在我的控制器或路由文件中(这不是我的代码,但我尝试过类似的逻辑,它们都返回空数组或错误)

代码语言:javascript
运行
复制
exports.test = (request,response,next) => {
    let {user} = request.body;
    const u=await User.findById(user);
    //Chat.find({from:user}).populate('from').populate('to').then(r => response.json(r));
    //user ="5f46319ac483a43d98ae3626";
    Chat.aggregate([
        {$match:{$or:[{"to":user},{"from":user}]}},
        {
            $group:{"_id":
                {
                    "text":{
                        $cond:[
                            {
                                $gt:[
                                    {$substr:["$to",0,1]},
                                    {$substr:["$from",0,1]}]
                            },
                            {$concat:["$to"," and ","$from"]},
                            {$concat:["$from"," and ","$to"]}
                        ]
                    }
                },
                "text":{$first:"$text"}
            }
        }]).then(result => {
        response.json(result)
    }).catch(error => {
        console.log("[[error]]",error)
        response.json({error})
    });
}

这是我正在处理的数据(导出的JSON文件)

代码语言:javascript
运行
复制
[
  {
    "_id": {
      "$oid": "5f4a3ae0a7ff491f3024668e"
    },
    "isFile": false,
    "to": {
      "$oid": "5f46325ec483a43d98ae3627"
    },
    "from": {
      "$oid": "5f46319ac483a43d98ae3626"
    },
    "text": "Hi John,Yash here!",
    "createdAt": {
      "$date": "2020-08-29T11:24:16.416Z"
    },
    "updatedAt": {
      "$date": "2020-08-29T11:24:16.416Z"
    },
    "__v": 0
  },
  {
    "_id": {
      "$oid": "5f4a3affa7ff491f3024668f"
    },
    "isFile": false,
    "to": {
      "$oid": "5f46319ac483a43d98ae3626"
    },
    "from": {
      "$oid": "5f46325ec483a43d98ae3627"
    },
    "text": "hello Yash - John",
    "createdAt": {
      "$date": "2020-08-29T11:24:47.519Z"
    },
    "updatedAt": {
      "$date": "2020-08-29T11:24:47.519Z"
    },
    "__v": 0
  },
  {
    "_id": {
      "$oid": "5f4a3b25a7ff491f30246690"
    },
    "isFile": false,
    "to": {
      "$oid": "5f4632c8c483a43d98ae3628"
    },
    "from": {
      "$oid": "5f46319ac483a43d98ae3626"
    },
    "text": "Hello Don, Yash this side.",
    "createdAt": {
      "$date": "2020-08-29T11:25:25.067Z"
    },
    "updatedAt": {
      "$date": "2020-08-29T11:25:25.067Z"
    },
    "__v": 0
  }
]

所以我需要的是与他聊天的用户的最后一条消息,与用户参考。在本例中,对于Id:5f46319ac483a43d98ae3626,应呈现最后两个对象

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-29 23:10:24

您可以尝试使用$split来获取有限的记录,

代码语言:javascript
运行
复制
db.collection.aggregate([
  {
    $match: {
      $or: [
        { "to": ObjectId("5f46319ac483a43d98ae3626") },
        { "from": ObjectId("5f46319ac483a43d98ae3626") }
      ]
    }
  },
  // for descending order
  { $sort: { updatedAt: -1 } },
  {
    $group: {
      _id: {
        $cond: [
          { $eq: ["$to", ObjectId("5f46319ac483a43d98ae3626")] },
          { $concat: [{ $toString: "$to" }, " and ", { $toString: "$from" }] },
          { $concat: [{ $toString: "$from" }, " and ", { $toString: "$to" }] }
        ]
      },
      updatedAt: { $first: "$updatedAt" },
      // push messages
      messages: { $push: "$$ROOT" }
    }
  },
  // order by descending order
  { $sort: { updatedAt: -1 } },
  // limit to 2 messages only
  { $addFields: { messages: { $slice: ["$messages", 2] } } }
])

Playground

要连接用户数据,可以使用$lookup

票数 2
EN

Stack Overflow用户

发布于 2020-08-29 21:30:11

我想你可以在聊天时使用这个模式

代码语言:javascript
运行
复制
   MessageSchema = new mongoose.Schema({
      from: {
        type: string,
        required: true,
      },
      to: {
        type: string,
        required: true,
      },
      time: {
        type: Date,
        default: Date.now(),
      },
      message: {
        type: string,
        required: true,
      },
    });


ChatSchema = new mongoose.Schema({
        firstUserId:{
            type: mongoose.Schema.Types.ObjectId,
            required: true,
        },
        secondUserId:{
            type: mongoose.Schema.Types.ObjectId,
            required: true,
        },
        Chat: MessageSchema,
})

数据将是这样的

代码语言:javascript
运行
复制
[
  {
    firstUserId: "hjakdsf323275lks",
    secondUserId: "asdfe2342232aas",
    Chat: [
      {
        from: "hjakdsf323275lks",
        to: "asdfe2342232aas",
        time: "18/7/2020 20:06:09",
        message: "Hi ",
      },
      {
        from: "asdfe2342232aas",
        to: "hjakdsf323275lks",
        time: "18/7/2020 21:07:09",
        message: "hello ",
      },....
    ],
  },
];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63647058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档