在填充中排序不起作用(猫鼬)

Posted

技术标签:

【中文标题】在填充中排序不起作用(猫鼬)【英文标题】:sort in populate does not work (Mongoose) 【发布时间】:2017-01-10 03:20:28 【问题描述】:

我的MongoDB版本是3.2,mongoose版本是4.6.0

这些是我的架构:

// chat
const chatSchema = new mongoose.Schema(
  users: [ type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true ],
  lastMessage:   type: mongoose.Schema.Types.ObjectId, ref: 'Message' 
);
export const ChatModel = mongoose.model('Chat', chatSchema);

// message
const messageSchema = new mongoose.Schema(
  user:  type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true ,
  chat:  type: mongoose.Schema.Types.ObjectId, ref: 'Chat', required: true ,
  text:  type: String, required: true ,
  timestamp:  type: Date, default: Date.now 
);
export const MessageModel = mongoose.model('Message', messageSchema);

我想根据 lastMessage 的时间戳按 desc 顺序进行排序。这三个我都试过了

ChatModel
  .find(, 'lastMessage')
  .populate('lastMessage', 'timestamp', null,  sort:  timestamp: -1 )
  .exec()
  .then(chats => console.log(chats))

ChatModel
  .find(, 'lastMessage')
  .populate(
    path: 'lastMessage',
    select: 'timestamp',
    options:  sort:  timestamp: -1 
  )
  .exec()
  .then(chats => console.log(chats))

ChatModel
  .find(, 'lastMessage')
  .populate('lastMessage', 'timestamp')
  .sort( 'lastMessage.timestamp': -1 )
  .exec()
  .then(chats => console.log(chats))

另外,无论我使用-11'desc' 或'asc' for timestamp,它总是给我相同的结果:

  [
    _id: 57c8a682cde8baf5c36eb1fc,
    lastMessage: 
      _id: 57c8baa29a293eace7f9be15,
      timestamp: 2016-09-01T23:32:50.344Z
    
  , 
    _id: 57c8a6d0cde8baf5c36eb1fe,
    lastMessage: 
      _id: 57c8fabb4362b3c25d828774,
      timestamp: 2016-09-02T04:06:19.421Z
    
  ]

什么可能导致这种情况?谢谢


更新1:

好像是Mongoose的一个bug。

请追踪this issue on GitHub。


更新2: 说不支持。但我不知道为什么......在这种情况下,在populate 中使用sort 是否错误?

【问题讨论】:

它可能对你有用***.com/questions/16352768/… @abdulbarik 谢谢,我确实遵循了这些,但仍然没有工作。 你使用的是哪个版本的猫鼬? @abdulbarik MongoDB 3.2 版,猫鼬 4.5.10 版 嘿,你找到解决办法了吗?我也面临同样的问题。 【参考方案1】:

文档 (http://mongoosejs.com/docs/api.html#document_Document-populate) 声明如下:

Chat.find().populate(
    path: 'lastMessage'
  , select: 'timestamp'
  , options:  sort:  timestamp: -1 
).exec(function (err, chats) 
  //do something
)

如果这不起作用,首先检查它,例如文本,看看它是否是日期时间排序问题

更新: 当我重新阅读您的问题时,我注意到了这个问题,您想根据最后一条消息时间戳对所有消息进行排序。不需要对总体进行排序,因为它只返回 1 项(没有最后一条消息的数组)。

所以语法是:

Chat.find().populate(
        path: 'lastMessage'
      , select: 'timestamp')
.sort('lastMessage.timestamp')
.exec(function (err, chats) 
      //do something
    )

【讨论】:

谢谢,试过.populate('lastMessage', 'timestamp').sort( 'lastMessage.timestamp': -1 ),还是不行.. 似乎用点符号排序到一个在 MongoDB v4.0.21 中不起作用的填充对象。【参考方案2】:

试试这个..

    ChatModel
    .find()
    .populate('lastMessage', 'timestamp', 
        options: 
            sort: 
                'lastMessage.timestamp': 'desc'
            
        
    )
.exec()
    .then(chats => console.log('chats', chats))

【讨论】:

更新了答案,现在可以试试吗? 你能把-1换成'desc''asc'吗?由于您使用的是 mongoose@4.x

以上是关于在填充中排序不起作用(猫鼬)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Q 的猫鼬嵌套填充不起作用

带排序的猫鼬查询不起作用

虚拟填充猫鼬

在猫鼬中排序

猫鼬 findByIdAndUpdate 不起作用。 new: true 包括

为什么jqgrid排序不起作用?