在填充中排序不起作用(猫鼬)
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))
另外,无论我使用-1
或1
、'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以上是关于在填充中排序不起作用(猫鼬)的主要内容,如果未能解决你的问题,请参考以下文章