Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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
Javascript 在Mongoose中对子文档进行排序_Javascript_Node.js_Mongodb_Sorting_Mongoose - Fatal编程技术网

Javascript 在Mongoose中对子文档进行排序

Javascript 在Mongoose中对子文档进行排序,javascript,node.js,mongodb,sorting,mongoose,Javascript,Node.js,Mongodb,Sorting,Mongoose,我试图按日期对Mongoose的输出进行排序,日期存储在子文档中。我相信这可以在客户端更容易地完成,但我想限制服务器资源的使用,并懒散地加载子文档,而不是一次加载所有子文档 我正在开发一个私人消息功能。我有一个名为Conversations defined的模式,还有一个名为messages defined的模式。其代码如下: const mongoose = require('mongoose'); const ChatSchema = new mongoose.Schema({ m

我试图按日期对Mongoose的输出进行排序,日期存储在子文档中。我相信这可以在客户端更容易地完成,但我想限制服务器资源的使用,并懒散地加载子文档,而不是一次加载所有子文档

我正在开发一个私人消息功能。我有一个名为Conversations defined的模式,还有一个名为messages defined的模式。其代码如下:

const mongoose = require('mongoose');

const ChatSchema = new mongoose.Schema({
    messageBody: {
      type: String,
      required: true
    },
    from: {
      type: String,
      required: true
    }
  },
  {
    timestamps: true // Saves createdAt and updatedAt as dates. createdAt will be our timestamp.
  });

const ConversationSchema = new mongoose.Schema({
  participants: [String],
  messages: [ChatSchema]
});

module.exports = mongoose.model('Chat', ChatSchema);
module.exports = mongoose.model('Conversation', ConversationSchema);
消息保存得很好,信息似乎正确地存储在数据库中。当我尝试使用cursor.sort()方法首先返回最近的消息时,问题就出现了。查询(要遵循的代码)按预期返回一条消息,但我无法让它返回最近的消息

exports.getConversations = function(req, res, next) {
  // Only return one message from each conversation to display as snippet
  Conversation.find({ participants: req.user._id })
  .sort('-messages.createdAt')
  .slice('messages', 1).exec(function(err, conversations) {
    if (err) {
      res.send({ error: err });
      return next(err);
    } // other code...

我已经尝试了我在这篇文章中找到的每一种排序变体,但都没有效果:

你不需要与ORM(一种速度慢、文档记录差的ORM)搏斗,就可以通过嵌套属性对对象数组进行排序。穿上你最棒的裤子,开始你自己的分类功能,今天到此为止

function byMessageCreatedAt(a, b){
    //modify the below comparison however you need to to compare two times
    return a.messages.createdAt - b.messages.createdAt
}

var results = conversation.find({blah}).sort(byMessageCreatedAt);

关于javascript排序的详细信息

我试图避免的一件事是为每个对话请求所有消息的开销。如果在一次对话中有数百条或数千条消息,并且每次用户访问他们的收件箱时都会被删除,那么这将是非常低效的,对吗?也许我错了。似乎应该有更好的方法来做这么琐碎的事情。从那以后我就试过了。这些让我很接近,但也没有让我完全达到目的,因为我无法使用.find()或.select()筛选结果。要清楚的是:通过mongoose提供的语法进行排序只是语法上的糖分。无论使用哪种排序方法,每次都会对结果集进行排序。你的评论与你原来的完全不同。您最初的问题是“如何对查询结果进行排序”。现在您要问“如何限制结果集”。