Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从userchat获取每个用户的最后一个文档-mongoose_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js 从userchat获取每个用户的最后一个文档-mongoose

Node.js 从userchat获取每个用户的最后一个文档-mongoose,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,用户模式 const userSchema = new Schema({ name: { type: String, required: true }, phoneno: { type: String }, email: { type: String }, password: { type: String }, profilePic: { type: String }, socketId: { type: String }, }); module.exports = mo

用户模式

const userSchema = new Schema({
  name: { type: String, required: true },
  phoneno: { type: String },
  email: { type: String },
  password: { type: String },
  profilePic: { type: String },
  socketId: { type: String },
});
module.exports = mongoose.model("User", userSchema);
const userChatSchema = new Schema({
  message: { type: String, required: true },
  sender: { type: Schema.Types.ObjectId, required: true, ref: "User" },
  receiver: { type: Schema.Types.ObjectId, required: true, ref: "User" },
  time: { type: Date, required: true },
});
module.exports = mongoose.model("UserChat", userChatSchema);
用户聊天模式

const userSchema = new Schema({
  name: { type: String, required: true },
  phoneno: { type: String },
  email: { type: String },
  password: { type: String },
  profilePic: { type: String },
  socketId: { type: String },
});
module.exports = mongoose.model("User", userSchema);
const userChatSchema = new Schema({
  message: { type: String, required: true },
  sender: { type: Schema.Types.ObjectId, required: true, ref: "User" },
  receiver: { type: Schema.Types.ObjectId, required: true, ref: "User" },
  time: { type: Date, required: true },
});
module.exports = mongoose.model("UserChat", userChatSchema);
我需要一个查询来获取当前登录用户与所有其他用户的最后一次用户聊天,即当前登录用户可以是发送者或接收者,所有其他用户也可以是发送者或接收者,并且该聊天必须是登录用户与其他用户之间的最新聊天

e、 g.如果当前登录的用户是ObjectId(“6039c2513b3fd51f3595d82f”), 然后查询必须给出以下输出:

[
  {
    _id: ObjectId("6039c2393b3fd51f3595d82e"),
    name: "userONE",
    phoneno: "123456",
    latestMsg: {
      _id: ObjectId("6039c2df3b3fd51f3595d833"),
      message: "from userONE to userTWO 1",
      receiver: ObjectId("6039c2513b3fd51f3595d82f"), // logged in user
      sender: ObjectId("6039c2393b3fd51f3595d82e"),
      time: ISODate("2021-02-27T03:56:15.122Z"),
    },
  },
  {
    _id: ObjectId("6039c25c3b3fd51f3595d830"),
    name: "userTHREE",
    phoneno: "12345678",
    latestMsg: {
      _id: ObjectId("6039c60ea8061225286e57e4"),
      message: "from userTWO to userTHREE 4",
      receiver: ObjectId("6039c25c3b3fd51f3595d830"),
      sender: ObjectId("6039c2513b3fd51f3595d82f"), // logged in user
      time: ISODate("2021-02-27T04:09:50.579Z"),
    },
  },
  {
    _id: ObjectId("6039c2673b3fd51f3595d831"),
    name: "userFOUR",
    phoneno: "123456789",
    latestMsg: {
      _id: ObjectId("6039c5f2a8061225286e57e2"),
      message: "from userFOUR to userTWO 3",
      receiver: ObjectId("6039c2513b3fd51f3595d82f"), // logged in user
      sender: ObjectId("6039c2673b3fd51f3595d831"),
      time: ISODate("2021-02-27T04:09:22.283Z"),
    },
  },
]

答案的情景:

  • 总共有三个用户
  • Prakash1,Prakash2和Dheemanth聊了两次
  • Dheemanth已回复Prakash1,因此Dheemanth的回复是显示的最后一条消息
  • Dheemanth没有回复Prakash2,因此显示了Prakash2的最后一条消息
  • 查询:

    db.users.aggregate([
    {
    $match:{
    _id:ObjectId(“6039437ce0c7d52970d3f9f3”)//已登录用户\u id
    }
    },
    {
    $lookup:{
    来自:“聊天室”,
    let:{user\u id:$\u id},
    管道:[
    {
    $match:{
    $expr:{
    $or:[
    {$eq:[“$receiver”,“$$user_id”]},
    {$eq:[“$sender”,“$$user_id”]}
    ]
    }
    }
    },
    {
    $sort:{time:-1}
    },
    {
    $group:{
    _身份证:{
    $concat:[
    {$toString:{$min:[“$sender”,“$receiver”]},
    {$toString:{$max:[“$sender”,“$receiver”]}
    ]
    },
    发件人:{$first:“$sender”},
    接收方:{$first:$receiver},
    消息:{$first:$message},
    时间:{$first:$time}
    }
    }
    ],
    as:“最新的SG”
    }
    },
    {$unwind:$latestMsg}
    ]);
    
    输出:用于Dheemanth

    /*1创建日期:2021年2月27日,凌晨12:22:44*/
    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “名称”:“Dheemanth”,
    “最新政府公报”:{
    “_id”:“6039437ce0c7d52970d3f9f36039437ce0c7d52970d3f9f5”,
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f5”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “留言”:“你能帮我吗?”,
    “时间”:ISODate(“2021-02-27T00:38:00.000+05:30”)
    }
    },
    /*创建日期:2021年2月27日凌晨12:22:44*/
    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “名称”:“Dheemanth”,
    “最新政府公报”:{
    “_id”:“6039437ce0c7d52970d3f9f36039437ce0c7d52970d3f9f6”,
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f3”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f6”),
    “消息”:“确定粘贴您的查询。”,
    “时间”:ISODate(“2021-02-27T00:41:00.000+05:30”)
    }
    }
    
    输出:用于Prakash1

    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f6”),
    “名称”:“Prakash1”,
    “最新政府公报”:{
    “_id”:“6039437ce0c7d52970d3f9f36039437ce0c7d52970d3f9f6”,
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f3”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f6”),
    “消息”:“确定粘贴您的查询。”,
    “时间”:ISODate(“2021-02-27T00:41:00.000+05:30”)
    }
    }
    
    测试数据:

    使用者

    /*1创建日期:2021年2月27日,凌晨12:22:44*/
    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f6”),
    “名称”:“Prakash1”
    },
    /*创建日期:2021年2月27日凌晨12:22:44*/
    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f5”),
    “名称”:“Prakash2”
    },
    /*创建日期:2021年2月27日凌晨12:22:44*/
    {
    “_id”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “名称”:“Dheemanth”
    }
    
    聊天

    /*1创建日期:2021年2月27日下午1:21:05*/
    {
    “_id”:ObjectId(“6039f9e9e0c7d52970d3fa43”),
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f6”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “信息”:“你好,我是普拉卡什”,
    “时间”:ISODate(“2021-02-27T00:39:00.000+05:30”)
    },
    /*创建日期:2021年2月27日下午1:21:05*/
    {
    “_id”:ObjectId(“6039f9e9e0c7d52970d3fa44”),
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f6”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “信息”:“需要帮助!!!”,
    “时间”:ISODate(“2021-02-27T00:40:00.000+05:30”)
    },
    /*创建日期:2021年2月27日下午1:21:05*/
    {
    “_id”:ObjectId(“6039f9e9e0c7d52970d3fa45”),
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f3”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f6”),
    “消息”:“确定粘贴您的查询。”,
    “时间”:ISODate(“2021-02-27T00:41:00.000+05:30”)
    },
    /*创建日期:2021年2月27日下午1:21:05*/
    {
    “_id”:ObjectId(“6039f9e9e0c7d52970d3fa46”),
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f5”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “信息”:“你好,我是普拉卡什”,
    “时间”:ISODate(“2021-02-27T00:37:00.000+05:30”)
    },
    /*创建日期:2021年2月27日下午1:21:05*/
    {
    “_id”:ObjectId(“6039f9e9e0c7d52970d3fa47”),
    “发送方”:对象ID(“6039437ce0c7d52970d3f9f5”),
    “接收人”:ObjectId(“6039437ce0c7d52970d3f9f3”),
    “留言”:“你能帮我吗?”,
    “时间”:ISODate(“2021-02-27T00:38:00.000+05:30”)
    }
    
    如果您可以共享示例数据,您正在尝试的代码和预期的结果将是一个方便的工具。对于用户集合[link]对于用户聊天集合[link],您可以在Mongo Playerd中定义多个集合:
    db={“User”:[{},…],“UserChat”:[{},…]}
    您的查询返回当前登录用户收到的最新聊天记录,我想要的是返回当前登录用户和其他用户之间最新聊天记录的查询